CTFHub部分记录

CTFHub部分记录

技能树里几道学到新知识的题目的记录,还不错还不错😎

技能树-web-00截断

这一题考察00截断,但是不是单纯地在文件名后缀处截断,那种方法只能绕过前端,但是本题后端还会有检测,因此需要构造绕过后端检测的截断。
看到群里有些师傅问一些爆破文件名之类问题…感觉还是写一下题解吧,希望能有帮助,自己也记录一下。(为了写题解,又花30金币…LinE师傅求报销啊)

题目分析

拿到题目先看看源码:

if (!empty($_POST['submit'])) {
$name = basename($_FILES['file']['name']);
$info = pathinfo($name);
$ext = $info['extension'];
$whitelist = array("jpg", "png", "gif");
if (in_array($ext, $whitelist)) {
$des = $_GET['road'] . "/" . rand(10, 99) . date("YmdHis") . "." . $ext;
if (move_uploaded_file($_FILES['file']['tmp_name'], $des)) {
echo "<script>alert('上传成功')</script>";
} else {
echo "<script>alert('上传失败')</script>";
}
} else {
echo "文件类型不匹配";
}
}

通过审计可知,代码的逻辑如下:

  • 1、首先取到上传文件的扩展名$ext
  • 2、将扩展名与白名单进行匹配,为jpgpnggif才能通过第一次过滤
  • 3、扩展名匹配之后,为上传的文件构造了一个新的存储路径$des,这个地方用了rand()函数,就看到有些师傅问是不是要爆破…看到后面的$ext怎么能想着爆破呢?这是正常上传图片的存储路径,人家后缀都是通过匹配的$ext,自己的小马肯定是php啊…

这题是考察00截断的,突破点也很明显了:构造$des的时候,首先取的是road参数的内容/var/www/html/upload/,想到看到的绕过后端检测的一篇文章,需要在存储路径的地方构造截断:/var/www/html/upload/shell.php%00
这里注意一下:存储路径后面要加一个php后缀的文件名,然后利用%00进行截断,这样上传文件的内容就存到了shell.php里,还要注意要用%00截断,由于内容在请求头中,直接在hex中改00会报bad request。

解题

抓包改包如下:


成功上传,蚁剑连接url/var/www/html/upload/shell.php即可。

命令注入-综合

一个考察点比较全面,但是也是比较入门的题目。主要考察了对连接符、特殊文件名、读取文件命令等过滤的绕过。
这个题解题的时候走了一大圈弯路,并且还撞到了墙上,后来用正常姿势解了出来…

题目分析

既然比较综合,先看看源码:

<?php

$res = FALSE;

if (isset($_GET['ip']) && $_GET['ip']) {
$ip = $_GET['ip'];
$m = [];
if (!preg_match_all("/(\||&|;| |\/|cat|flag|ctfhub)/", $ip, $m)) {
$cmd = "ping -c 4 {$ip}";
exec($cmd, $res);
} else {
$res = $m;
}
}
?>

可以看到对ip传参内容中的连接符空格cat命令、flag字段进行了过滤,对空格过滤很简单,${IFS}就行,之前的一篇博客也写过,对catflag的过滤也很简单,用\即可绕过:ca\t f\lag,关键就在于对|、&、;三个连接符的过滤,最初没有考虑是GET传参,忘记了用%0a代替;,而是选择用8/16进制进行绕过,从而跳进了大坑…
这种方法构造思路就是:利用字符的ascii码对应的8/16进制表示字符,结合printf命令输出字符串,然后利用$将字符串当作命令执行,比如:

ls:$(printf${IFS}"\154\163")


但是构造的payload一直没打通,于是本地测了一下:

原来是输出的内容被当作ip的一部分了… 但是没搞懂为啥这样构造出来的字符会被当做前面命令的一部分…

解题

由于是GET传参,利用连接符的url编码就能绕过,比如;对应%0a,构造payload如下:

ip=127.0.0.1%0acd${IFS}fl\ag_is_here%0aca\t${IFS}fl\ag_64331483515023.php

即可拿到flag:

这里的cat其实还可以用morelesstailsort命令替换,具体可以查一下几个命令的区别。
对文件名的过滤也可以通过利用变量的形式来绕过,网上有很多例子可以参考,这里不再写了。

关于更多命令注入的绕过姿势可以参考这里

Comments


:D 一言句子获取中...

Loading...Wait a Minute!