您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)sql注入的一些零散知識(shí)點(diǎn)總結(jié),文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
sqlmap寫(xiě)一句馬的具體過(guò)程
堆疊注入
union injection(聯(lián)合注入)
常見(jiàn)的注入繞過(guò)姿勢(shì)
sql注入預(yù)編譯與常見(jiàn)繞過(guò)姿勢(shì)
先寫(xiě)一個(gè)文件上傳的文件,名字為“ tmpujhum.php ”。
然后通過(guò)這個(gè)文件上傳的木馬,將shell(tmpbcluy.php)上傳,
執(zhí)行命令的木馬名字為“ tmpbcluy.php ”
具體過(guò)程可以參考: https://xz.aliyun.com/t/7942
都可以直接通過(guò)命令寫(xiě)文件了,為什么還要先寫(xiě)一個(gè)上傳文件的木馬,在通過(guò)這個(gè)木馬上傳一句馬?
*答:**
sqlmap官方這么寫(xiě)得代碼,所在按照這個(gè)流程,開(kāi)玩笑~~
主要原因是大多數(shù)waf的對(duì)命令直接寫(xiě)文件的監(jiān)控比上傳木馬的監(jiān)控嚴(yán)格。
即通過(guò)這種“多此一舉”的思路,可以提高上傳成功一句馬的概率
在SQL中,分號(hào)(;)是用來(lái)表示一條sql語(yǔ)句的結(jié)束。
試想一下我們?cè)?; 結(jié)束一個(gè)sql語(yǔ)句后繼續(xù)構(gòu)造下一條語(yǔ)句,會(huì)不會(huì)一起執(zhí)行?
因此這個(gè)想法也就造就了堆疊注入。
~“ id=1 ”正常
~試試“ id=1a ”,假設(shè)報(bào)錯(cuò),說(shuō)明數(shù)據(jù)沒(méi)有被強(qiáng)轉(zhuǎn)
~在試試“ id=1; ”假設(shè)沒(méi)有報(bào)錯(cuò),說(shuō)明“;”沒(méi)有被代入查詢(xún),而是當(dāng)做了sql語(yǔ)句的結(jié)束符
~此時(shí),此位置大概率存在堆疊注入
堆疊注入的局限性在于并不是每一個(gè)環(huán)境下都可以執(zhí)行,
可能受到API或者數(shù)據(jù)庫(kù)引擎不支持的限制,
當(dāng)然了權(quán)限不足也可以解釋為什么攻擊者無(wú)法修改數(shù)據(jù)或者調(diào)用一些程序。
絕大多數(shù)的sql注入都是利用的此姿勢(shì),
詳細(xì)不在贅述,可以直接參考之前的文章。
區(qū)別就在于union 或者union all執(zhí)行的語(yǔ)句類(lèi)型是有限的,僅僅可以用來(lái)執(zhí)行查詢(xún)語(yǔ)句,
而堆疊注入可以執(zhí)行的是任意的語(yǔ)句。
**例如以下這個(gè)例子,即堆疊可以執(zhí)行成功,聯(lián)合注入不能成功**
用戶(hù)輸入:1; DELETE FROM products服務(wù)器端生成的sql語(yǔ)句為:
Select * from products where productid=1;DELETE FROM products
當(dāng)執(zhí)行查詢(xún)后,第一條顯示查詢(xún)信息,第二條則將整個(gè)表進(jìn)行刪除。
絕大多數(shù)的waf都是通過(guò)正則匹配過(guò)濾/攔截請(qǐng)求
一般一個(gè)waf會(huì)同時(shí)上線(xiàn)N個(gè)規(guī)則,這些規(guī)則同時(shí)生效的情況下,僅僅饒過(guò)一個(gè)依舊會(huì)被攔截
繞過(guò)waf正則匹配規(guī)則的同時(shí),注入的sql語(yǔ)句可以被正常解析執(zhí)行。
數(shù)據(jù)上:
大小寫(xiě) 、、很老的waf可以繞過(guò)
加解密、編碼解碼
等價(jià)函數(shù) union select == union all select
特殊符號(hào)
反序列化
注釋符混用 、、mysql特性:
database/**/() == database()
內(nèi)聯(lián)注釋?zhuān)?*一個(gè)sql版本號(hào)sql執(zhí)行內(nèi)容*/,具體不在展開(kāi)
方式:
更改提交方式 、、部分waf默認(rèn)僅僅檢測(cè)get(但是假設(shè)后端不接收post也沒(méi)什么卵用);
變異
其他:
FUZZ
、、模糊測(cè)試,使用腳本/工具生成大量payload,直接爆破waf,看看哪些語(yǔ)句可以過(guò)waf
數(shù)據(jù)庫(kù)特性
、、mysql特性:
union%23a%0Aselect 1,2,3#
== union#a(換號(hào))select 1,2,3#
== union select 1,2,3#
、、mysql特性:
/*!select * from users*/ 會(huì)正常執(zhí)行
垃圾數(shù)據(jù)溢出
HTTP參數(shù)污染
、、多個(gè)參數(shù)的情況下,一般默認(rèn)取最后一個(gè)
、、?id=1/**&id=-1%20union%20select%201,2,3%23*/
即“ 1/**-1 union select 1,2,3#*/ ”
在mysql之中“ /** 內(nèi)容不會(huì)執(zhí)行 */ ”所以WAF認(rèn)為是安全的,
但是因?yàn)锳pache的特性,
其最終接收的參數(shù)為:“ -1 union select 1,2,3#*/ ”
靜態(tài)資源
、、即本來(lái)為php?id=1 改為 php/a.txt(b.js等)?id=1
結(jié)果不受影響,但是可以過(guò)一些老waf
用注釋配合參數(shù)污染繞waf的成功率是比較高的
使用sqlmap注意,
~UA自帶的要改一下,參數(shù)就可以改,可以改為百度等搜索引擎的UA
~可以設(shè)置繞waf腳本來(lái)提高成功率,而且腳本寫(xiě)也挺簡(jiǎn)單
~自己測(cè)試的時(shí)候,可以用參數(shù)將sqlmap的流量代理到burp,然后對(duì)比自己正常瀏覽器的流量,看看區(qū)別
~必要的時(shí)刻,連接代理池直接暴力配合開(kāi)干
預(yù)編譯一般在Java的框架中使用,在提高sql語(yǔ)句效率的同時(shí)也可以攔截掉很多注入的情況,
但是仍可以被繞過(guò)的,
應(yīng)用場(chǎng)景:
當(dāng)應(yīng)用顯示多條數(shù)據(jù)時(shí),通常可以選擇正向排序或者逆向排序,此時(shí)就會(huì)用到 ASC/DESC
ASC/DESC 是SQL語(yǔ)句中影響語(yǔ)義的關(guān)鍵字,是不能用單引號(hào)引起來(lái)的
假設(shè)ASC/DESC是接收的前端傳入,即存在被注入的風(fēng)險(xiǎn)。
如何處理:
比較安全的方式是使用白名單,排序方式也只有兩種,可使用簡(jiǎn)單的條件判斷語(yǔ)句
<?php if($_POST['order'] === 'DESC'){ $order = 'DESC'; }else{ $order = 'ASC' }
應(yīng)用場(chǎng)景:
表名與列名是不能被預(yù)編譯的,這是由于在預(yù)編譯生成語(yǔ)法樹(shù)的過(guò)程中,
預(yù)處理器在檢查解析后的語(yǔ)法樹(shù)時(shí),會(huì)確定數(shù)據(jù)表和數(shù)據(jù)列是否存在,
此兩者必須為具體值,不能被占位符 ? 所替代
假設(shè)表名/字段名是接收的前端傳參,即存在被注入的風(fēng)險(xiǎn)
如何處理:
參考下邊order by的情況
order by 用來(lái)指定某個(gè)字段作為排序依據(jù),前面也解釋了字段名不能使用預(yù)編譯
假設(shè)order by后邊的字段是接收的前端傳參,即存在被注入的風(fēng)險(xiǎn)
具體的一些繞過(guò)方法可以搜索“ case when ”
如何處理:
為了避免直接拼接SQL語(yǔ)句,可以將列名定義為常量,
再通過(guò)白名單的方式進(jìn)行拼接,能夠有效防止SQL注入
當(dāng)然,這里也可以單獨(dú)對(duì)傳入的語(yǔ)句配合正則匹配過(guò)濾,但是效果不如這種方式簡(jiǎn)潔有效。
前端表單:
<form action="" method="post"> <select name="order"> <option value="0">id</option> <option value="1">name</option> <option value="2">age</option> </select> <input type="submit" name="submit"> </form>
白名單函數(shù):
<?php $i = $_POST['order']; switch($i){ case 0: $order = "id"; break; case 1: $order = "name"; break; default: $order = "age"; break; }
假設(shè)ASC/DESC是接收的前端傳入,即存在被注入的風(fēng)險(xiǎn)。
假設(shè)表名/字段名是接收的前端傳參,即存在被注入的風(fēng)險(xiǎn)
假設(shè)order by后邊的字段是接收的前端傳參,即存在被注入的風(fēng)險(xiǎn)
上述就是小編為大家分享的sql注入的一些零散知識(shí)點(diǎn)總結(jié)了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。