php中的危险函数

命令执行函数

system()

能够将字符串作为OS 命令执行

并且使用system() 可以将结果输出到前端

1
2
3
4
5
6
7
8
9
10
<?php
if(isset($_GET['cmd'])){
echo "<pre>";
system($_GET['cmd']);
}else{
echo"
?cmd=ipconfig
";
}
?>

image-20240520104704462

exec()

将字符串当作os 命令执行,但是不会自动返回到前端

  • 需要手动的输出命令的执行结果
  • 不支持命令中存在空格
1
2
3
4
5
6
7
8
9
10
<?php
if (isset($_GET['cmd'])) {
echo "<pre>";
print exec($_GET['cmd']);
} else {
echo "
?cmd=ipconfig
";
}

注意这个相比上面一个添加了print

shell_exec()

把函数中的参数当作os 命令执行

  • 需要手动的输出命令的执行结果
1
2
3
4
5
6
7
<?php
if(isset($_GET['cmd'])){
print shell_exec($_GET['cmd']);
}else{
echo"?cmd=whoami";
}
?>

passthru()

将字符串当做系统命令执行

  • 自带输出功能
1
2
3
4
5
6
7
<?php
if(isset($_GET['cmd'])){
passthru($_GET['cmd']);
}else{
echo"?cmd=whoami";
}
?>

popen()

此函数没有回显,但是可以执行命令

  • 需要将输出结果导入文件
1
2
3
4
5
6
<pre>
<?php
if(isset($_GET['cmd'])){
popen($_GET['cmd'],'r');
}
?>

image-20240520105936686

image-20240520105940820

反引号

反引号``内的字符,也会被解析成os 命令

image-20240520110112058

image-20240520110120316

代码执行函数

eval()

会将符合PHP 语法规范字符串当作php 代码执行

  • 虽然可以以函数的方式调用eval(),但是eval() 不是PHP 的函数,而是一种语法结构。

  • eval() 执行的的字符串要以分号结束。

  • 其他命令执行的方式

    • ?code=phpinfo();
    • ?code=${phpinfo()};
    • ?code=1;phpinfo();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
//phpinfo();
//$str = "phpinfo();";
//echo $str;
$str = $_GET['code'];
eval($str);
// ?code=phinfo();
// ?code=print(md5(123456));
// ?code=system(whoami);
// ?code=system('net user');
//
?>
$str = addslashes($_GET['code']);
echo $str;
eval($str);
/*
编码
1. ascii 编码
?code=eval(chr(115).chr(121).chr(115).chr(116).chr(101).chr(109).chr(40).chr(39).chr(110).chr(101).chr(116).chr(32).chr(117).chr(115).chr(101).chr(114).chr(39).chr(41).chr(59));

2. base64 编码
c3lzdGVtKCduZXQgdXNlcicpOw==
?code=eval(base64_decode(c3lzdGVtKCduZXQgdXNlcicpOw));
*/

assert()

同样会将字符串当做PHP 代码来执行。

  • 字符串结尾可以不添加分号。
1
2
3
4
5
6
7
8
<?php
if(isset($_GET['code'])){
$code=$_GET['code'];
assert($code);
}else{
echo "Please submit code!<br />?code=phpinfo()";
}
?>

preg_replace()

preg_replace函数分析 - AU9U5T (tsy244.github.io)

preg_replace() 函数的作用是对字符串进行正则匹配后替换。

  • 搜索$subject 中匹配$pattern 的部分,以$replacement 进行替换。
  • $pattern 处,存在e 修饰符时,$replacement 的值会被当成PHP 代码来执行。
1
2
3
4
5
6
7
8
<?php
if(isset($_GET['code'])){
$code=$_GET['code'];
preg_replace("/\[(.*)\]/e",'\\1', $code);
}else{
echo"?code=[phpinfo()]";
}
?>

执行的代码中的参数会被转义

call_user_func()

call_user_func() 等函数都有调用其他函数的功能,回调函数。

1
2
3
4
$funName = 'assert';
$para = 'phpinfo()';
call_user_func($funName,$para);
//assert(phpinof())
  • $funName 被调用的函数名
  • $para 作为被调用函数的参数,参数中的单引号没有被转义
1
2
3
4
5
6
7
8
9
<?php
if(isset($_GET['fun'])){
$fun=$_GET['fun'];
$para=$_GET['para'];
call_user_func($fun,$para);
}else{
echo"?fun=assert&amp;para=phpinfo()";
}
?>

动态函数$a($b)

这种写法跟使用call_user_func()的初衷一样,用来更加方便地调用函数,但是一旦过了不严格就会造成代码执行漏洞。

1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET['a'])){
$a=$_GET['a'];
$b=$_GET['b'];
$a($b);
}else{
echo "
?a=assert&amp;b=phpinfo()
";
}
?>

php中的危险函数
https://tsy244.github.io/2024/05/20/渗透/php中的危险函数/
Author
August Rosenberg
Posted on
May 20, 2024
Licensed under