mysql 可以使用更安全的pdo_mysql接口來處理
新羅ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)的ssl證書銷售渠道,可以享受市場價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
所有的查詢參數(shù)話綁定
$sql = 'select * from table where id=:id';
$pdo-prepare($sql)-bindValue(':id', $id, PDO::PARAM_INT)-excute();
$pdo-fetch(); 來獲取數(shù)據(jù) 這樣可以很有效的避免被注入
當(dāng)給sqlmap這么一個(gè)url的時(shí)候,它會:
1、判斷可注入的參數(shù)
2、判斷可以用那種SQL注入技術(shù)來注入
3、識別出哪種數(shù)據(jù)庫
4、根據(jù)用戶選擇,讀取哪些數(shù)據(jù)
sqlmap支持五種不同的注入模式:
1、基于布爾的盲注,即可以根據(jù)返回頁面判斷條件真假的注入。
2、基于時(shí)間的盲注,即不能根據(jù)頁面返回內(nèi)容判斷任何信息,用條件語句查看時(shí)間延遲語句是否執(zhí)行(即頁面返回時(shí)間是否增加)來判斷。
3、基于報(bào)錯(cuò)注入,即頁面會返回錯(cuò)誤信息,或者把注入的語句的結(jié)果直接返回在頁面中。
4、聯(lián)合查詢注入,可以使用union的情況下的注入。
5、堆查詢注入,可以同時(shí)執(zhí)行多條語句的執(zhí)行時(shí)的注入。
sqlmap支持的數(shù)據(jù)庫有:
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
可以提供一個(gè)簡單的URL,Burp或WebScarab請求日志文件,文本文檔中的完整http請求或者Google的搜索,匹配出結(jié)果頁面,也可以自己定義一個(gè)正則來判斷那個(gè)地址去測試。
測試GET參數(shù),POST參數(shù),HTTP Cookie參數(shù),HTTP User-Agent頭和HTTP Referer頭來確認(rèn)是否有SQL注入,它也可以指定用逗號分隔的列表的具體參數(shù)來測試。
本人ctf選手一名,在最近做練習(xí)時(shí)遇到了一些sql注入的題目,但是sql注入一直是我的弱項(xiàng)之一,所以寫一篇總結(jié)記錄一下最近學(xué)到的一些sql注入漏洞的利用。
在可以聯(lián)合查詢的題目中,一般會將數(shù)據(jù)庫查詢的數(shù)據(jù)回顯到首頁面中,這是聯(lián)合注入的前提。
適用于有回顯同時(shí)數(shù)據(jù)庫軟件版本是5.0以上的MYSQL數(shù)據(jù)庫,因?yàn)镸YSQL會有一個(gè)系統(tǒng)數(shù)據(jù)庫information_schema, information_schema 用于存儲數(shù)據(jù)庫元數(shù)據(jù)(關(guān)于數(shù)據(jù)的數(shù)據(jù)),例如數(shù)據(jù)庫名、表名、列的數(shù)據(jù)類型、訪問權(quán)限等
聯(lián)合注入的過程:
判斷注入點(diǎn)可以用and 1=1/and 1=2用于判斷注入點(diǎn)
當(dāng)注入類型為數(shù)字型時(shí)返回頁面會不同,但都能正常執(zhí)行。
sql注入通常為數(shù)字型注入和字符型注入:
1、數(shù)字型注入
數(shù)字型語句:
在這種情況下直接使用and 1=1/and 1=2是都可以正常執(zhí)行的但是返回的界面是不一樣的
2、字符型注入
字符型語句:
字符型語句輸入我們的輸入會被一對單引號或這雙引號閉合起來。
所以如果我們同樣輸入and 1=1/and 1=2會發(fā)現(xiàn)回顯畫面是并無不同的。
在我們傳入and 1=1/and 1=2時(shí)語句變?yōu)?/p>
傳入的東西變成了字符串并不會被當(dāng)做命令。
所以字符型的測試方法最簡單的就是加上單引號 ' ,出現(xiàn)報(bào)錯(cuò)。
加上注釋符--后正?;仫@界面。
這里還有的點(diǎn)就是sql語句的閉合也是有時(shí)候不同的,下面是一些常見的
這一步可以用到order by函數(shù),order by 函數(shù)是對MySQL中查詢結(jié)果按照指定字段名進(jìn)行排序,除了指定字 段名還可以指定字段的欄位進(jìn)行排序,第一個(gè)查詢字段為1,第二個(gè)為2,依次類推,所以可以利用order by就可以判斷列數(shù)。
以字符型注入為例:
在列數(shù)存在時(shí)會正常回顯
但是列數(shù)不存在時(shí)就會報(bào)錯(cuò)
這步就說明了為什么是聯(lián)合注入了,用到了UNION,UNION的作用是將兩個(gè)select查詢結(jié)果合并
但是程序在展示數(shù)據(jù)的時(shí)候通常只會取結(jié)果集的第一行數(shù)據(jù),這就讓聯(lián)合注入有了利用的點(diǎn)。
當(dāng)我們查詢的第一行是不存在的時(shí)候就會回顯第二行給我們。
講查詢的數(shù)據(jù)置為-1,那第一行的數(shù)據(jù)為空,第二行自然就變?yōu)榱说谝恍?/p>
在這個(gè)基礎(chǔ)上進(jìn)行注入
可以發(fā)現(xiàn)2,3都為可以利用的顯示點(diǎn)。
和前面一樣利用union select,加上group_concat()一次性顯示。
現(xiàn)在非常多的Web程序沒有正常的錯(cuò)誤回顯,這樣就需要我們利用報(bào)錯(cuò)注入的方式來進(jìn)行SQL注入了
報(bào)錯(cuò)注入的利用步驟和聯(lián)合注入一致,只是利用函數(shù)不同。
以updatexml為例。
UpdateXML(xml_target, xpath_expr, new_xml)
xml_target: 需要操作的xml片段
xpath_expr: 需要更新的xml路徑(Xpath格式)
new_xml: 更新后的內(nèi)容
此函數(shù)用來更新選定XML片段的內(nèi)容,將XML標(biāo)記的給定片段的單個(gè)部分替換為 xml_target 新的XML片段 new_xml ,然后返回更改的XML。xml_target替換的部分 與xpath_expr 用戶提供的XPath表達(dá)式匹配。
這個(gè)函數(shù)當(dāng)xpath路徑錯(cuò)誤時(shí)就會報(bào)錯(cuò),而且會將路徑內(nèi)容返回,這就能在報(bào)錯(cuò)內(nèi)容中看到我們想要的內(nèi)容。
而且以~開頭的內(nèi)容不是xml格式的語法,那就可以用concat函數(shù)拼接~使其報(bào)錯(cuò),當(dāng)然只要是不符合格式的都可以使其報(bào)錯(cuò)。
[極客大挑戰(zhàn) 2019]HardSQL
登錄界面嘗試注入,測試后發(fā)現(xiàn)是單引號字符型注入,且對union和空格進(jìn)行了過濾,不能用到聯(lián)合注入,但是有錯(cuò)誤信息回顯,說明可以使用報(bào)錯(cuò)注入。
利用updatexml函數(shù)的報(bào)錯(cuò)原理進(jìn)行注入在路徑處利用concat函數(shù)拼接~和我們的注入語句
發(fā)現(xiàn)xpath錯(cuò)誤并執(zhí)行sql語句將錯(cuò)誤返回。
在進(jìn)行爆表這一步發(fā)現(xiàn)了等號也被過濾,但是可以用到like代替等號。
爆字段
爆數(shù)據(jù)
這里就出現(xiàn)了問題flag是不完整的,因?yàn)閡pdatexml能查詢字符串的最大長度為32,所以這里要用到left函數(shù)和right函數(shù)進(jìn)行讀取
報(bào)錯(cuò)注入有很多函數(shù)可以用不止updatexml一種,以下三種也是常用函數(shù):
堆疊注入就是多條語句一同執(zhí)行。
原理就是mysql_multi_query() 支持多條sql語句同時(shí)執(zhí)行,用;分隔,成堆的執(zhí)行sql語句。
比如
在權(quán)限足夠的情況下甚至可以對數(shù)據(jù)庫進(jìn)行增刪改查。但是堆疊注入的限制是很大的。但是與union聯(lián)合執(zhí)行不同的是它可以同時(shí)執(zhí)行無數(shù)條語句而且是任何sql語句。而union執(zhí)行的語句是有限的。
[強(qiáng)網(wǎng)杯 2019]隨便注
判斷完注入類型后嘗試聯(lián)合注入,發(fā)現(xiàn)select被過濾,且正則不區(qū)分大小寫過濾。
那么就用堆疊注入,使用show就可以不用select了。
接下去獲取表信息和字段信息
那一串?dāng)?shù)字十分可疑大概率flag就在里面,查看一下
這里的表名要加上反單引號,是數(shù)據(jù)庫的引用符。
發(fā)現(xiàn)flag,但是沒辦法直接讀取。再讀取words,發(fā)現(xiàn)里面有個(gè)id字段,猜測數(shù)據(jù)庫語句為
結(jié)合1'or 1=1#可以讀取全部數(shù)據(jù)可以利用改名的方法把修改1919810931114514為words,flag修改為id,就可以把flag讀取了。
最終payload:
盲注需要掌握的幾個(gè)函數(shù)
在網(wǎng)頁屏蔽了錯(cuò)誤信息時(shí)就只能通過網(wǎng)頁返回True或者False判斷,本質(zhì)上是一種暴力破解,這就是布爾盲注的利用點(diǎn)。
首先,判斷注入點(diǎn)和注入類型是一樣的。
但是盲注沒有判斷列數(shù)這一步和判斷顯示位這兩步,這是和可回顯注入的不同。
判斷完注入類型后就要判斷數(shù)據(jù)庫的長度,這里就用到了length函數(shù)。
以[WUSTCTF2020]顏值成績查詢?yōu)槔?/p>
輸入?yún)?shù)后,發(fā)現(xiàn)url處有個(gè)get傳入的stunum
然后用到length函數(shù)測試是否有注入點(diǎn)。
發(fā)現(xiàn)頁面有明顯變化
將傳入變?yōu)?/p>
頁面回顯此學(xué)生不存在
那么就可以得出數(shù)據(jù)庫名長度為3
測試發(fā)現(xiàn)過濾了空格
然后就是要查數(shù)據(jù)庫名了,這里有兩種方法
一、只用substr函數(shù),直接對比
這種方法在寫腳本時(shí)可以用于直接遍歷。
二、加上ascii函數(shù)
這個(gè)payload在寫腳本時(shí)直接遍歷同樣可以,也可用于二分法查找,二分法速度更快。
接下來的步驟就和聯(lián)合注入一樣,只不過使用substr函數(shù)一個(gè)一個(gè)截取字符逐個(gè)判斷。但是這種盲注手工一個(gè)一個(gè)注十分麻煩所以要用到腳本。
直接遍歷腳本
二分法腳本
時(shí)間盲注用于代碼存在sql注入漏洞,然而頁面既不會回顯數(shù)據(jù),也不會回顯錯(cuò)誤信息
語句執(zhí)行后也不提示真假,我們不能通過頁面的內(nèi)容來判斷
所以有布爾盲注就必有時(shí)間盲注,但有時(shí)間盲注不一定有布爾盲注
時(shí)間盲注主要是利用sleep函數(shù)讓網(wǎng)頁的響應(yīng)時(shí)間不同從而實(shí)現(xiàn)注入。
sql-lab-less8:
無論輸入什么都只會回顯一個(gè)you are in...,這就是時(shí)間盲注的特點(diǎn)。
當(dāng)正常輸入?id=1時(shí)時(shí)間為11毫秒
判斷為單引號字符型注入后,插入sleep語句
明顯發(fā)現(xiàn)響應(yīng)時(shí)間為3053毫秒。
利用時(shí)間的不同就可以利用腳本跑出數(shù)據(jù)庫,后續(xù)步驟和布爾盲注一致。
爆庫
爆表
爆字段
腳本
在進(jìn)行SQL注入時(shí),發(fā)現(xiàn)union,and,or被完全過濾掉了,就可以考慮使用異或注入
什么是異或呢
異或是一種邏輯運(yùn)算,運(yùn)算法則簡言之就是:兩個(gè)條件相同(同真或同假)即為假(0),兩個(gè)條件不同即為真(1),null與任何條件做異或運(yùn)算都為null,如果從數(shù)學(xué)的角度理解就是,空集與任何集合的交集都為空
即 1^1=0,0^0=0,1^0=1
利用這個(gè)原理可以在union,and,or都被過濾的情況下實(shí)現(xiàn)注入
[極客大挑戰(zhàn) 2019]FinalSQL
給了五個(gè)選項(xiàng)但是都沒什么用,在點(diǎn)擊后都會在url處出現(xiàn)?id。
而且union,and,or都被過濾
測試發(fā)現(xiàn)?id=1^1會報(bào)錯(cuò)
但是?id=1^0會返回?id=1的頁面,這就是前面說的原理,當(dāng)1^0時(shí)是等于1的所以返回?id=1的頁面。
根據(jù)原理寫出payload,進(jìn)而寫出腳本。
爆庫
爆表
爆字段
據(jù)此可以寫出基于異或的布爾盲注腳本
實(shí)驗(yàn)推薦:課程:SQL注入初級(合天網(wǎng)安實(shí)驗(yàn)室)
工具/材料:Management Studio。
1、首先在桌面上,點(diǎn)擊“Management Studio”圖標(biāo)。
2、然后在該界面中,右鍵點(diǎn)擊數(shù)據(jù)表“設(shè)計(jì)”選項(xiàng)。
3、之后在該界面中,添加布爾字段BooleanType,數(shù)據(jù)類型為“bit”選項(xiàng)。
4、接著在該界面中,點(diǎn)擊上方工具欄里“保存”按鈕。
5、最后在該界面中,顯示布爾字段BooleanType值為。