Web安全解析Boolean注入攻擊原理
1. Boolean注入攻擊
Boolean注入攻擊的測試地址:http://127.0.0.1/sqli/boolean.php?id=1。
訪問該網(wǎng)站時,頁面返回yes,如圖19所示。
圖19 訪問id=1時頁面的結(jié)果
在URL后添加一個單引號,再次訪問,發(fā)現(xiàn)返回結(jié)果由yes變成no,如圖20所示。
圖20 訪問id=1'時頁面的結(jié)果
訪問id=1' and 1=1%23,id=1' and 1=2%23,發(fā)現(xiàn)返回的結(jié)果分別是yes和no,更愛ID的值,返現(xiàn)返回的仍然是yes或者no,由此可判斷,頁面只返回yes或no,而沒有返回數(shù)據(jù)庫中的數(shù)據(jù),所以此處不可使用Union注入。
此處可以嘗試利用Boolean注入,Boolean注入是指構(gòu)造SQL判斷語句,通過查看頁面的返回結(jié)果來推測哪些SQL判斷條件是成立的,以此獲取數(shù)據(jù)庫中的數(shù)據(jù)。我們先判斷數(shù)據(jù)庫名的長度,語句如下所示。
' and length(database())>=1--+
因為查詢語句前面有單引號,所以和源碼中的SQL語句拼接后會多出一個單引號,因此需要注釋符來注釋。
http請求中+會被替換為空格與--組合成為注釋符,空格也可用%20來代替,--%20效果等同。
由于#是用來指導瀏覽器動作的,對服務器端完全無用,所以,HTTP請求中不包括#。在第一個#后面出現(xiàn)的任何字符,都會被瀏覽器解讀為位置標識符。這意味著,這些字符都不會被發(fā)送到服務器端。所以如果想用#注釋符,就要將#轉(zhuǎn)換為%23。
故上面的語句還可寫為:
' and length(database())>=1--%20
或
' and length(database())>=1%23
1的位置上可以是任意數(shù)字,如' and length(database())>=3--+和' and length(database())>=4--+,我們可以構(gòu)造這樣的語句,然后觀察也免得返回結(jié)果,如圖21~23所示。
圖21 判斷數(shù)據(jù)庫庫名的長度(1)
圖22 判斷數(shù)據(jù)庫庫名的長度(2)
圖23 判斷數(shù)據(jù)庫庫名的長度(3)
以上幾個語句的意思是,數(shù)據(jù)庫庫名的長度大于等于3,結(jié)果為yes;數(shù)據(jù)庫庫名的唱的大于等于4,結(jié)果為no。結(jié)合以上幾個語句,可以判斷出數(shù)據(jù)庫的長度為3。
接著,使用逐字符判斷的方式獲取數(shù)據(jù)庫庫民。數(shù)據(jù)庫庫名的范圍一般在a~z、0~9之內(nèi),可能還有一些特殊字符,這里的字母不區(qū)分大小寫。逐字符判斷的SQL語句為:
' and substr(database(),1,1)='t'--+
substr是截取的意思,其意思是截取database()的值,從第一個字符開始,每次只返回一個。
substr的用法和limit的有區(qū)別,需要注意。limit是從0開始排序,而substr是從1開始排序??梢允褂肂urp的爆破功能爆破每個位置的字符值,如圖24所示,爆破結(jié)果如圖25所示。
圖24 利用Burp爆破數(shù)據(jù)庫的庫名(1)
圖25 利用Burp爆破數(shù)據(jù)庫的庫名(2)
其實還可以使用ASCII碼的字符進行查詢,t的ASCII碼是116,而在MySQL中,ASCII轉(zhuǎn)換的函數(shù)為ord(),則逐字符判斷的SQL語句應該為如下所示。
' and ord(substr(database(),1,1))=116--+
從Union注入和Burp的爆破結(jié)果中我們知道,數(shù)據(jù)庫名是'test'。
查詢表名、字段名的語句也應粘貼在database()的位置,從Union注入中已經(jīng)知道數(shù)據(jù)庫'test'的第一個表名是emails,第一個字母應當是e,判斷語句如下所示。
' and substr((select table_name from information_schema.tables where table_schema='test' limit 0,1),1,1)='e'--+
以此類推,就可以查詢出所有的表名和字段名,如圖27所示,利用Burp爆破的結(jié)果如圖28所示。
2. Boolean注入代碼分析
在Boolean注入頁面中程先獲取GET參數(shù)ID,通過pre_match判斷其中是否存在union/sleep/benchmark等危險字符。然后將參數(shù)ID拼接到SQL語句,從數(shù)據(jù)庫中查詢,如果有結(jié)果,則返回yes,否則返回no。當訪問該頁面時,代碼根據(jù)數(shù)據(jù)庫查詢結(jié)果返回yes或no,而不返回數(shù)據(jù)庫中的任何數(shù)據(jù),所以頁面上智慧顯示yes或no,代碼如下所示。
<?php $con=mysqli_connect("localhost","root","root","test"); // 檢測連接 if (mysqli_connect_errno()) { echo "連接失敗: " . mysqli_connect_error(); } $id = @$_GET['id']; if(preg_match("/union|sleep|benchmark/i",$id)) { exit("no"); } $sql = "select * from users where `id`='".$id."'"; $result = mysqli_query($con,$sql); if(!$result) { exit("no"); } $row = mysqli_fetch_array($result); if ($row) { exit("yes"); }else{ exit("no"); } ?>
當訪問id=1' or 1=1%23時,數(shù)據(jù)庫執(zhí)行的語句為select * from users where ‘id'=‘1' or 1=1#,由于or 1=1是永真條件,所以此頁面可定會返回yes。當訪問id=1' and 1=2%23時,數(shù)據(jù)庫執(zhí)行的語句為select * from users where ‘id'=‘1' and 1=2#,由于and1=2是永假條件,所以此時頁面肯定會返回no。
以上就是Web安全解析Boolean注入攻擊原理的詳細內(nèi)容,更多關于Web安全Boolean注入攻擊的資料請關注腳本之家其它相關文章!
相關文章
網(wǎng)絡安全中流量加密實現(xiàn)工具冰蝎4.0介紹
冰蝎是一個動態(tài)二進制加密網(wǎng)站管理客戶端。在實戰(zhàn)中,第一代webshell管理工具"菜刀"的流量特征非常明顯,很容易就被安全設備檢測到?;诹髁考用艿膚ebshell變得越來越多,"冰蝎"在此應運而生2022-09-09突破神奇的Cloudflare防火墻的網(wǎng)絡安全學習
這篇文章主要為大家介紹了突破神奇的Cloudflare防火墻的網(wǎng)絡安全學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Web網(wǎng)絡安全漏洞分析XSS常用語句及編碼繞過詳解
這篇文章主要為大家介紹了Web網(wǎng)絡安全漏洞分析XSS常用語句及編碼繞過詳解,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步早日升職加薪2021-11-11