您现在的位置是:首页 > 正文

SUCTF-2019-EasySQL

2024-02-01 05:58:00阅读 6

看一下源代码

<html>
<head>
</head>

<body>

<a> Give me your flag, I will tell you if the flag is right. </a>
<form action="" method="post">
<input type="text" name="query">
<input type="submit">
</form>
</body>
</html>

Array
(
    [0] => 1
)

通过post请求

在这里插入图片描述

输一个非零数字有回显,输一个字母无回显

在这里插入图片描述

输入1'无回显,证明含有sql注入但无错误回显

在这里插入图片描述

反复尝试了一下,可以堆叠注入

1;show databases; 查库
1;show tables;查表

在这里插入图片描述

在这里插入图片描述

发现有一个flag表

网上搜了一下 比赛的时候后面给了select

select $_GET['query'] || flag from flag

*没有被过滤掉

试一下*,1select *,1||flag from flag
即变成了 select *,1 from flag

就可以查出表的内容了

在这里插入图片描述

或者是之前有提到可以进行堆叠注入

关键的查询代码是 select $post['query']||flag from Flag

要想办法让 ||不是逻辑或
官方给的 payload 是1;set sql_mode=PIPES_AS_CONCAT;select 1

拼接一下就是select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

sql_mode是一组语法校验规则

sql_mode相关链接

⑨PIPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat类似

则将sql_mode设置为PIPES_AS_CONCAT

使用||相当于是将 select 1select flag from flag 的结果拼接在一起

即通过1;来结束上一sql语句然后将sql_mode设置为PIPES_AS_CONCAT,最后将select 1select flag from flag 的结果拼接在一起

在这里插入图片描述

总结

本关运用到的注入方法为堆叠注入

关于堆叠注入union联合注入

分号;表示一条SQL语句的结束.如果在;结束后继续写入下一条语句,会一起执行。这个就是堆叠注入。

联合注入也是将两条语句合并在一起

union联合注入执行的语句类型有限,只能用来执行查询语句,但堆叠注入不同,可以执行任意类型的语句。

比如本题中的:select 1;set sql_mode=PIPES_AS_CONCAT;select 1||flag from Flag

参考

https://blog.csdn.net/qq_45552960/article/details/104185620

网站文章