在SQL注入中利用MySQL隱形的類型轉換繞過WAF檢測

web應用通常採用基於表單的身份驗證方式(頁面雛形以下圖所示),處理邏輯就是將表單中提交的用戶名和密
碼傳遞到後臺數據庫去查詢,並根據查詢結果判斷是否經過身份驗證。對於LAMP架構的web應用而言,處理邏輯採用PHP,後臺數據庫採用MySQL。而在這一處理過程,因爲種種處理不善,會致使很多嚴重的漏洞,除去弱口令與暴力破解,最多見的就是SQL注入。SQL注入能夠在SQLNuke——mysql 注入load_file Fuzz工具看到如何利用,而本篇博客的重點是利用MySQL隱形的類型轉換繞過WAF的檢測。php

 

下面使用實例來展現這一過程。
 
實例包括2個腳本login.html與login.php,1張存放用戶名與密碼的member.user表

 

(1)表單login.htmlhtml

 

<html> <body> <form id="form1" name="form1" method="post" action="login.php"> <label>UserName <input name="user" type="text" id="user"/> </label> <br/> <label>Password <input name="password" type="text" id="password"/> </label> <br/> <label> <input name="login" type="submit" id="login" value="Login"/> </label> </body> </html>

 

(2)認證處理login.phpmysql

 

<?php if(isset($_POST["login"])) { $link = mysql_connect("localhost","root","toor") or die ("cannot connect database".mysql_error()); mysql_select_db("member") or die ("cannot select the db"); $query = "select * from user where user='".$_POST["user"]."'and password='".md5($_POST["password"])."'"; echo $query."<br/>"; $result = mysql_query($query) or die ("the query failed:".mysql_error()); echo "<br/>"; $match_count = mysql_num_rows($result); if($match_count){ while($row = mysql_fetch_assoc($result)){ echo "<strong>User: </strong>".$row["user"]."<br/>"; echo "<strong>Password: </strong>".$row["password"]."<br/>"; echo "<br/>"; } } else { echo "Wrong User or password <br/>"; echo '<a href="http://10.1.36.34/login.html">Back</a><br/>'; } mysql_free_result($result); mysql_close($link); }

 

注意紅色字體部分,爲用戶輸入的用戶名和密碼,沒有進行任何過濾就傳入到數據庫中去進行查詢. 該腳本將查詢字符串及查詢結果展現在頁面中以供直觀的演示SQL查詢結果。web

 
(3)member.user

 

你們看一張常見的用戶表user表,由兩個字段構成user用戶名和password字段。sql

表中包含8行數據數據庫

 

很明顯這是一段有SQL注入的程序,接下來咱們來看看下面這些有趣的查詢結果
 
(1) 輸入用戶名a’+'b#

 

查詢結果以下圖所示架構

(2)輸入用戶名45a’+'b’#ide

 

 

 

 產生以上結果的緣由是算術操做符+的出現將字符型的user轉換爲了數值性的user
 
dani,tanjiti,dani123,0dani 對應的數值爲0
123dani,123tanjiti對應的數值爲123
45dani,045tanjiti對應的數值爲45
'a'+'b'對應數值爲0+0=0,會把類型轉換後爲0的用戶名搜索出來
'45a'+'b'對應數值爲45+0=45,會把類型轉換後爲45的用戶名搜索出來
除了+號,其餘算術操做符號也會發生類型的類型轉換,例如MOD,DIV,*,/,%,-,
 

 (3)輸入用戶名a’MOD’1′#工具

 ’a'MOD’1′對應的數值爲0 MOD 1 =0,會把user對應數值爲0的搜索出來post

 

(4)輸入用戶名‘-」#

 

 」-」對應的數值爲0 -0 =0,會把user對應數值爲0的搜索出來

 

 

bit操做符&,|,^,<< ,>>也有一樣的效果

 

(5)輸入用戶名‘/’1′#

 

 

」/’1′對應的數值爲0 /1 =0,會把user對應數值爲0的搜索出來

bit操做符&,|,^,<< ,>>也有一樣的效果

(6)輸入用戶名a’&’b'#

 ’a'&’b'對應的數值爲0&0 =0,會把user對應數值爲0的搜索出來

對應WAF防火牆而言,當輸入’ or 1=’1 時,ModSecurity防火牆會報錯(我沒有試驗過ModSecurity,博客中有介紹)

而上面的實例則能夠繞過防火牆.
 
總的來講,利用MySQL隱性的類型轉換來繞過WAF對SQL注入的檢測是蠻有想法的。
 
參考:

http://vagosec.org/2013/04/mysql-implicit-type-conversion/

相關文章
相關標籤/搜索