1.SQLi
代碼分析
session-input.php:
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated', 'phpids' ) );
$page = dvwaPageNewGrab();
$page[ 'title' ] = 'SQL Injection Session Input' . $page[ 'title_separator' ].$page[ 'title' ];
if( isset( $_POST[ 'id' ] ) ) {
$_SESSION[ 'id' ] = $_POST[ 'id' ];
//$page[ 'body' ] .= "Session ID set!<br /><br /><br />";
$page[ 'body' ] .= "Session ID: {$_SESSION[ 'id' ]}<br /><br /><br />";
$page[ 'body' ] .= "<script>window.opener.location.reload(true);</script>";
}
$page[ 'body' ] .= "
echo $page['body'];
<form action=\"#\" method=\"POST\">
<input type=\"text\" size=\"15\" name=\"id\">
<input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>
<hr />
<br />
<button onclick=\"self.close();\">Close</button>";
dvwaSourceHtmlEcho( $page );
?>
high.php:
<?php
if( isset( $_SESSION [ 'id' ] ) ) {
// Get input
$id = $_SESSION[ 'id' ];
// Check database
$query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' );
// Get results
while( $row = mysqli_fetch_assoc( $result ) ) {
// Get values
$first = $row["first_name"];
$last = $row["last_name"];
// Feedback for end user
$html .= "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
一圖勝千言:
漏洞利用
查詢(xún)頁(yè)面URL: http://127.0.0.1/DVWA-master/vulnerabilities/sqli/session-input.php
回顯頁(yè)面URL: http://127.0.0.1/DVWA-master/security.php
注意查詢(xún)頁(yè)面和回顯頁(yè)面不同,所以需要使用second-order參數(shù)進(jìn)行二階注入。
將POST請(qǐng)求的數(shù)據(jù)包保存至/home/e.txt采桃,使用sqlmap進(jìn)行注入如下圖:
2. SQL Blind Injection
代碼分析
cookie-input.php:
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '../../' );
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php';
dvwaPageStartup( array( 'authenticated', 'phpids' ) );
$page = dvwaPageNewGrab();
$page[ 'title' ] = 'Blind SQL Injection Cookie Input' . $page[ 'title_separator' ].$page[ 'title' ];
if( isset( $_POST[ 'id' ] ) ) {
setcookie( 'id', $_POST[ 'id' ]);
$page[ 'body' ] .= "Cookie ID set!<br /><br /><br />";
$page[ 'body' ] .= "<script>window.opener.location.reload(true);</script>";
}
$page[ 'body' ] .= "
<form action=\"#\" method=\"POST\">
<input type=\"text\" size=\"15\" name=\"id\">
<input type=\"submit\" name=\"Submit\" value=\"Submit\">
</form>
<hr />
<br />
<button onclick=\"self.close();\">Close</button>";
dvwaSourceHtmlEcho( $page );
?>
high.php:
<?php
if( isset( $_COOKIE[ 'id' ] ) ) {
// Get input
$id = $_COOKIE[ 'id' ];
// Check database
$getid = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";
$result = mysqli_query($GLOBALS["___mysqli_ston"], $getid ); // Removed 'or die' to suppress mysql errors
// Get results
$num = @mysqli_num_rows( $result ); // The '@' character suppresses errors
if( $num > 0 ) {
// Feedback for end user
$html .= '<pre>User ID exists in the database.</pre>';
}
else {
// Might sleep a random amount
if( rand( 0, 5 ) == 3 ) {
sleep( rand( 2, 4 ) );
}
// User wasn't found, so the page wasn't!
header( $_SERVER[ 'SERVER_PROTOCOL' ] . ' 404 Not Found' );
// Feedback for end user
$html .= '<pre>User ID is MISSING from the database.</pre>';
}
((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}
?>
setcookie()定義了 Cookie阱佛,會(huì)和剩下的 HTTP 頭一起發(fā)送給客戶(hù)端朝巫。 和其他 HTTP 頭一樣溃列,必須在腳本產(chǎn)生任意輸出之前發(fā)送 Cookie(由于協(xié)議的限制)食零。 請(qǐng)?jiān)诋a(chǎn)生任何輸出之前(包括 <html> 和 <head> 或者空格)調(diào)用本函數(shù)辜羊。
sql blind的查詢(xún)頁(yè)面與回顯頁(yè)面URL相同,因此直接使用burpsuite抓取時(shí)序圖中最后一次GET請(qǐng)求的數(shù)據(jù)包保存為a.txt斜友,最后使用Sqlmap進(jìn)行注入即可炸裆,如下圖:
部分Sqlmap參數(shù)介紹:
1.--second-order(二階sql注入)
有些時(shí)候注入點(diǎn)輸入的數(shù)據(jù)看返回結(jié)果的時(shí)候并不是當(dāng)前的頁(yè)面,而是另外的一個(gè)頁(yè)面鲜屏,這時(shí)候就需要你指定到哪個(gè)頁(yè)面獲取響應(yīng)判斷真假烹看。–second-order后面跟一個(gè)判斷頁(yè)面的URL地址。
2.-r
sqlmap可以從一個(gè)文本文件中獲取HTTP請(qǐng)求洛史,這樣就可以跳過(guò)設(shè)置一些其他參數(shù)(比如cookie惯殊,POST數(shù)據(jù),等等)虹菲。當(dāng)請(qǐng)求是HTTPS的時(shí)候你需要配合這個(gè)--force-ssl參數(shù)來(lái)使用靠胜,或者你可以在Host頭后面加上:443
3.–batch
用此參數(shù),不需要用戶(hù)輸入毕源,將會(huì)使用sqlmap提示的默認(rèn)值一直運(yùn)行下去
4--level
共有五個(gè)等級(jí)浪漠,默認(rèn)為1,最大為5霎褐,sqlmap使用的payload可以在xml/payloads.xml中看到址愿,你也可以根據(jù)相應(yīng)的格式添加自己的payload。
這個(gè)參數(shù)不僅影響使用哪些payload同時(shí)也會(huì)影響測(cè)試的注入點(diǎn)冻璃,GET和POST的數(shù)據(jù)都會(huì)測(cè)試响谓,HTTP Cookie在level為2的時(shí)候就會(huì)測(cè)試,HTTP User-Agent/Referer頭在level為3的時(shí)候就會(huì)測(cè)試省艳。
總之在你不確定哪個(gè)payload或者參數(shù)為注入點(diǎn)的時(shí)候娘纷,為了保證全面性,建議使用高的level值跋炕。
5.--risk
共有四個(gè)風(fēng)險(xiǎn)等級(jí)赖晶,默認(rèn)是1會(huì)測(cè)試大部分的測(cè)試語(yǔ)句,2會(huì)增加基于事件的測(cè)試語(yǔ)句,3會(huì)增加OR語(yǔ)句的SQL注入測(cè)試遏插。
在有些時(shí)候捂贿,例如在UPDATE的語(yǔ)句中,注入一個(gè)OR的測(cè)試語(yǔ)句胳嘲,可能導(dǎo)致更新的整個(gè)表厂僧,可能造成很大的風(fēng)險(xiǎn)。
測(cè)試的語(yǔ)句同樣可以在xml/payloads.xml中找到了牛,你也可以自行添加payload颜屠。
6.-p
sqlmap默認(rèn)測(cè)試所有的GET和POST參數(shù),當(dāng)--level的值大于等于2的時(shí)候也會(huì)測(cè)試HTTP Cookie頭的值白魂,當(dāng)大于等于3的時(shí)候也會(huì)測(cè)試User-Agent和HTTP Referer頭的值汽纤。但是你可以手動(dòng)用-p參數(shù)設(shè)置想要測(cè)試的參數(shù) 上岗。例如: -p "id,user-anget"
當(dāng)你使用--level的值很大但是有個(gè)別參數(shù)不想測(cè)試的時(shí)候可以使用--skip參數(shù)福荸。例如:--skip="user-angent.referer"
在有些時(shí)候web服務(wù)器使用了URL重寫(xiě),導(dǎo)致無(wú)法直接使用sqlmap測(cè)試參數(shù)肴掷,可以在想測(cè)試的參數(shù)后面加*敬锐。