PHP代码审计基础知识

Love The Way You Lie 2022-11-27 10:10 260阅读 0赞

一,PHP核心配置

代码审计学习思路

一·配置典型两个文件(配置目录的规则文件)

php.ini(即仅在重启的时候可用)
.user.ini

二·配置典型的命令语句

配置文件常见三种配置:①目录限制②文件限制③函数与变量限制

1.用户限制语句,函数类

  1. 变量类
  2. 大小写敏感
  3. directive = value 大小写敏感
  4. 全局变量配置
  5. register_globals=off(作用是关闭自动注册的全局变量)
  6. 可使用的符号与参数类(ini文件中)
  7. !、()、|位或、&位与、~位非、
  8. Value可以使:用引号界定的字符串("foo”)、数组、PHP常量(E_ALL、M_PI)、INI常量(On、Off、none)、表达式
  9. 禁用函数类
  10. 禁用类/函数:disable_classes= ,disable_functions=opendir,readdir,scandir,fopen
  11. 接受逗号分隔的函数名。
  12. 短标签:short_open_tag=off
  13. 决定是否允许使用PHP代码开始标志的缩写形式(<??>)

用户限制文件类

  1. 文件上传类
  2. 设置上传文件类的大小
  3. file_uploads=on upload_max_filesize=8M
  4. 文件上传临时目录
  5. upload_tmp_dir =(系统临时目录/tmpC:\Windows\Temp
  6. 日志类
  7. 日志类
  8. error_log= 错误日志的位置,若不定义则默认写入Web服务器的错误日志中去。
  9. log_errors = on 建议将错误日志输出到文件而不是直接输出到前端。
  10. log_errors_max_length = 1024 错误日志关联信息的最大长度,设为0为无限长度。

用户限制目录与系统命令类

  1. 操作函数限制(对文件操作函数进行权限限制)
  2. safe_mode=off
  3. safe_mode_exec_dir=/var/www/html(执行程序主目录,即可执行系统命令的目录)
  4. 用户访问目录限制:open_basedir = .:/tmp/
  5. 一般可以设置只能访问网站目录,表示允许访问当前目录和/tmp/目录。

在这里插入图片描述

2,常见的危险函数

1.php代码执行函数

①eval()
概念:把字符串按照 PHP 代码进行执行
参数eval(phpcode)phpcode即需要规定计算的php代码

  1. <?php
  2. $a = $_GET['a'];
  3. eval($a);
  4. ?>

②assert()
检查一个断言是否为 FALSE

  1. <?php
  2. if(isset($_GET['moon']));{
  3. $moon=$_GET['moon'];
  4. assert("\$moon = $moon;");
  5. }
  6. ?>

③preg_replace()
作用:preg_replace 函数执行一个正则表达式的搜索和替换。

  1. <?php
  2. $a = $_GET['a'];
  3. echo preg_replace("/test/e", $a, "just test!")//即将test/e的字符串中的just test 替换为$a
  4. ?>

在这里插入图片描述
2.包含函数
require()、include()、require_once()、include _once()
分本地文件包含和远程文件包含,可以读取任意文件内容。
在这里插入图片描述3.命令执行函数
攻击函数
passthru() 给定参数执行程序后且输出结果

  1. function passthru(string $command,int[optional] $return_value)

proc_open():执行一个命令,并且打开用来输入的文件指针

popen():popen()的参数传递一条命令,并对并对 popen() 所打开的文件进行执行。

  1. <?php
  2. $cmd = $_GET['cmd'];
  3. echo "<pre>";
  4. echo popen($cmd,'r');
  5. echo "</pre>";
  6. ?>

system()
执行 command 参数所指定的命令

命令常用

  1. system("ls");
  2. system("cat *.php");

exec类
shell_exec( $cmd )即执行的命令,注意返回的全部的值

  1. $cmd = shell_exec('ping ' . $taeget);
  2. exec()
  3. shell_exec()差不多,不同点前者在sehll环境下执行返回的是所有的值,后者返回的是一个值
  4. exec( $command, $output, $return_var )

反引号–>与exec的功能相同

  1. <?php
  2. $action = $_GET['cmd'];
  3. echo "<pre>";
  4. echo `$action`;
  5. echo "<pre/>";
  6. ?>

在这里插入图片描述

防御函数
①.escapeshellarg() 函数
例子

  1. <?php
  2. $action = $_GET['cmd'];
  3. echo "<pre>";
  4. echo shell_exec($action);
  5. echo "<pre/>";
  6. ?>
  7. 执行 http://127.0.0.1/test.php?cmd=echo "123" >> 123.txt 有生成文件 123.txt
  8. <?php
  9. $action = $_GET['cmd'];
  10. echo "<pre>";
  11. echo shell_exec(escapeshellarg($action));
  12. echo "<pre/>";
  13. ?>

执行 http://127.0.0.1/test.php?cmd=echo “123” >> 123.txt 无生成文件
②.escapeshellcmd() 函数
除去字符串中的特殊符号,会转义命令中的所有shell元字符来完成工作
这些元字符包括:# & ;``,| * ? ~ < > ^ ( ) [ ] { } $ \

  1. <?php
  2. $action = $_GET['cmd'];
  3. echo "<pre>";
  4. echo shell_exec(escapeshellcmd($action));
  5. echo "<pre/>";
  6. ?>

在这里插入图片描述
③stripslashes() 函数
stripslashes() 函数删除由 addslashes() 函数添加的反斜杠。
提示:该函数可用于清理从数据库中或者从 HTML 表单中取回的数据

  1. #实例:
  2. <?php
  3. echo stripslashes("Who\'s Bill Gates?");
  4. ?>

在这里插入图片描述

4.文件操作函数
在这里插入图片描述
5.基础函数功能
在这里插入图片描述
使用案例

  1. 1.in_array()函数
  2. $people = array("Bill", "Steve", "Mark", "David");
  3. in_array("Mark", $people)
  4. #即查找people中mark是否存在
  5. 2.echo mb_substr("菜鸟教程", 0, 2);
  6. #基础知识-->即返回str中的指定部分
  7. 输出:菜鸟
  8. 3.mb_strpos函数,查找字符串在别一字符串中首次出现的位置
  9. <?php
  10. $str = 'http://www.feiniaomy.com';
  11. echo mb_strpos($str,'niao');
  12. ?>
  13. 输出-->14
  14. 4.strstr()与strstri()函数
  15. 查找 "Shanghai" "I love Shanghai!" 中的第一次出现,并返回字符串的剩余部分:
  16. <?php
  17. echo strstr("I love Shanghai!","Shanghai");
  18. ?>
  19. 5.preg_match绕过,匹配绕过
  20. https://my.oschina.net/u/4306654/blog/3363280/
  21. 6.extract()
  22. 函数从数组中将变量导入到当前的符号表
  23. 存在漏洞
  24. extract($_GET)存在变量覆盖漏洞
  25. 类似
  26. parse_str
  27. extract
  28. eval
  29. 7.ereg()
  30. 以区分大小写的方式在 string 中寻找与给定的正则表达式 pattern 所匹配的子串。
  31. **ereg** ( string `$pattern` , string `$string` [, array `&$regs` ] ) : int
  32. 8.preg_replace()
  33. 执行一个正则表达式的搜索和替换
  34. preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
  35. 搜索subject中匹配pattern的部分, replacement进行替换。
  36. webshell代码
  37. <?php
  38. @preg_replace(``"/[pageerror]/e"``,$_POST[``'error'``],``"saft"``);
  39. 9.parse_url()
  40. 解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。
  41. <?php
  42. $url = 'http://username:password@hostname/path?arg=value#anchor';
  43. print_r(parse_url($url));
  44. echo parse_url($url, PHP_URL_PATH);
  45. ?>
  46. Array
  47. (
  48. [scheme] => http
  49. [host] => hostname
  50. [user] => username
  51. [pass] => password
  52. [path] => /path
  53. [query] => arg=value
  54. [fragment] => anchor
  55. )
  56. /path
  57. 10.call_user_function
  58. 类似于一个特殊的调用函数功能
  59. <?php
  60. function nowamagic($a,$b)
  61. {
  62. echo $a;
  63. echo $b;
  64. }
  65. call_user_func('nowamagic', "111","222");
  66. call_user_func('nowamagic', "333","444");
  67. //显示 111 222 333 444
  68. ?>

三·常用的变量,函数与符号

在这里插入图片描述
$GLOBALS:引用全局作用域中可用的全部变量

  1. <?php
  2. function test(){
  3. echo $test="test3";
  4. echo $GLOBALS['test'];
  5. }
  6. $test = "test1";
  7. test();
  8. ?>
  9. #输出结果
  10. #test3test1

$_GET:HTTP GET 变量

  1. <?php
  2. print_r($_GET);
  3. ?>
  4. #如url?id=1&cmd=a
  5. #执行结果Array([id]=>1[cmd]=>a)

(其余类方式同,即输出的即为该变量的意思)
又如
$_COOKIE:HTTP Cookies

  1. <?php
  2. print_r($_COOKIE);
  3. ?>

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,260人围观)

还没有评论,来说两句吧...

相关阅读

    相关 php代码审计之phpcms

    这个难度比上一个要难一点,起码代码审计工具没有扫描出来特别简单的漏洞。用来是因为我下载的是修复版本的。。。。不过继续审计啊! 1.可能出现目录穿越的地方 出现了正则表达式限定

    相关 php代码审计(2)

    这个语言怎么这么没有节操。。我感觉它是什么框架都有自己的特色,然后特色多起来自成一派加入新版本里去了就。框架还好几个。大杂烩啊。不愧是脚本语言。 今天发现我太蠢了,应该跟着w