BUUCTF之EasySQL [SUCTF 2019]

本文探讨了一次PHP网站的SQL注入挑战,通过观察字符过滤和利用管道符进行堆叠注入,逐步揭示了如何绕过限制,最终获取flag。关键步骤包括利用`setsql_mode=pipes_as_concat`进行查询操纵。
摘要由CSDN通过智能技术生成

打开连接

页面就只给了这个,没有任何提示,也没有重定向,注入点明确,随便查询了几个数,页面正常,当混入字母的时候,无回显,抓包发现是POST传参,直接开始最简单的SQL注入,随便试了几个方法,基本上都被过滤掉了,用burpsuite抓包

再用fuzz字典跑一下,看看有哪些关键字被过滤掉了,这里跑的时候注意一下设置频率线程别调那么高,不然容易出现429(访问频繁)

可以看到,有许多重要的关键字被过滤掉了,什么时间盲注,报错盲注,联合查询,但也有没被过滤掉的,比如; | ||

这时候我们就可以尝试利用堆叠注入,先试试简单的,查询

1;show databases; -- -

接着再看一下表名

1;show tables; -- - 

 

再看看表内有啥,查询

1;select * from Flag; -- - 

发现又被过滤掉了,啧,还真是easy呢,只能看看大佬的WP了

发现又两种解题方法

原查询语句猜测

根据回显猜测代码里的SQL语句

我们发现回显用的是var_dump函数,当查询语句为纯数字的时候才回显,我们来看一下数据库的特性

可以看到当select 后面是数字的时候,即使查询的字段没有也不会报错,当查询的带有英文字母的时候,就会产生报错,所以初步判断查询的内容应该不是以往那种SQL注入的题目在where后面,而这里的就是在select后面的 ,试一下查询1,2,2,3,5

果然猜想正确,注意到原本查询唯独末尾的5变为了1,猜测是用到了管道符(| ||之类的),导致5回显失败,这里先试试看查询

*,1

让1根管道符中和掉,直接查询目标表的所有内容,看看会有啥

直接得到了flag?

如果没猜错在PHP里的原SQL语句应该就是

$sql = "select ".$_POST[query]."|| xxx from Flag" ;

emmm,wp里xxx是flag,我也不知道他们咋知道的是就是吧!

预解法

上面*,1解出来的flag很巧妙,但是真正的解法并非这样,我们知道原查询语句是

$sql = "select ".$_POST[query]."|| flag from Flag" ;

这时候我们可以利用数据库的语句,更改||的意思,把它改为连接符,这样的话,不管输入啥都会查询到flag这个字段,构建payload

1;set sql_mode=pipes_as_concat;select 1

这样的话SQL语句就变成了

select 1;set sql_mode=pipes_as_concat;select 1 || flag from Flag

​

set sql_mode=pipes_as_concat

这里就是把

管道符||的意思换成了连接符,相当于上SQL语句直接查询

select concat(1,flag) from Flag

 拿到flag

真是不容易啊

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金 帛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值