白帽子手法,想要通过客户端向后台注入php函数并执行?
除非后台不检查你的请求数据,甭管什么,直接执行!那叫“国门大开”!
实际上,可能吗?除了使用表单给后台提供数据,想想,你向Linux系统写入文件试试?什么用户,哪个组,有无write权限?这些读写权限,您能过吗?
题主说访问后端PHP,那么有两个方式,
1)借由web服务器访问php-fpm解析php文件并执行。
2)PHP命令行开服务,指定端口对外开放。
也就是说,题主只能走HTTP,WS协议。【ssh,ftp等不知道html+js能不能发起,请大神补充。】这两个协议对于linux系统的操作权限,已有限定,不可能让你烧杀抢掠。
退一万步讲,题主就是想要js发送form表单,发一串'drop database xxx' 或 'rm -Rf ./*' 或者 ':(){ :|:& };:' 类似这种东西。可不可以呢。可以啊,php接收之后,执行eval(), shell_exec(), proc_open(),那么多系统级的函数,尽管用就是。
原则上前端html+js是不能直接调用后端php中的函数的并返回结果的。
菜农在学习网站编程后,就被此事困扰很长时间。
因为前端的js可以通过ajax技术带参数访问后端的php过程,并返回结果。
那么是否js也能带参数访问任意php函数并返回结果?
菜农在网友的指点下完成此设想并测试通过!
其核心思想是通过js的ajax调用php的call_user_func_array()函数,以实现任意php函数的调用。
特别注意:
为了网站的安全和防止黑客的攻击,特别设立了$funclst数组,js只能调用$funclst数组内的特定函数。
php核心代码为:
$funclst = array("f0", "f1", "f2", "a1", "a2", "a3", "a4", "HotCount");
$func = $_REQUEST["function"];
if(in_array($func,$funclst) && function_exists($func)){//只能调用例程函数
if(isset($_REQUEST["age"]) && strpos(strtolower($_REQUEST["age"]), "http://")){
echo "函数$func()的参数中包含非法字符!!!";
} else {
$age =isset($_REQUEST["age"])? explode(",",$_REQUEST["age"]) : array();//参数以","分割
echo call_user_func_array($func,$age);
}
}else{
echo "函数$func()不存在!!!";
}
javascript通过Ajax直接调用任意PHP函数多参数例程
菜农在网友的指点下完成此例程,非常感谢!!!
如图所示,前两个分别是html和php的源码(csv内存储了访问该测试函数的次数,即网站访问计数器。