本文参考道哥的《白帽子讲Web安全》,其他来源于网络。暂时这样,以后修改 本文主要针对php6以下版本。
PHP安全环境
register_globals register_globals=offopen_basedir 建议在设置目录前加上/,例如:/home/web/htmlallow_url_include 建议设置为off,同时应设置 allow_url_fopen = off allow_url_include = offdisplay_errors display_errors = offlog_errors log_errors = onmagic_quotes_gpc magic_quotes_gpc = offcgi.fix_pathinfo cgi.fix_pathinfo = 0session.cookie_httponly session.cookie_httponly = 1session.cookie_secure 若全站为HTTPS,则开启session.cookie_secure = 1safe_mode 如果是共享环境:建议开启disable_functions逻辑漏洞
strcmp() strcmp(‘xd’,$password) http://xxx.com/password[]= ,成功绕过
md5 @md5( G E T [ ′ u s e r ′ ] ) = = @ m d 5 ( _GET['user']) == @md5( GET[′user′])==@md5(_GET[‘pass’]) http://xxx.com?user[]=1&pass[]=2
json_decode ( _ P O S T [ ′ m e s s a g e ′ ] ) ; i f ( \_POST['message']); if( _POST[′message′]);if(message->key == key){ echo “flag”; } 在burpsuit的请求中加参数 message={“key:”:0}
assert() payload : 123') phpinfo();#
序列化
反序列化时,如果表示对象属性个数的值大于真实的属性个数时就会跳过__wakeup()的执行
当目标对象被private、protected修饰时的构造方法时,我们可以使用 * 和 A 绕过
session反序列化漏洞,该漏洞是由session引擎机制的不同产生的一个漏洞,由php_serialize来进行接收反序列化的数据,php则开始反序列化数据的一个解析,如果存在反序列化字符串会自动的剖析,所以这就产生了一个漏洞 ini_set(‘session.serialize_handler’,“php”); ini_set(‘session.serialize_handler’,php),serialize);
文件包含
require_once()require()include()include_once()变量覆盖
当 regisiter_globals 为on时 查看register_globals: echo (int) ini_get(“register_globals”); 如果在php中存在 if(auth ) echo “push、push”; 在输入http://xxx.com?auth=1; 会将auto变量覆盖 http://xxx/com?GLOBALS[a]=1 全局变量覆盖extract 覆盖绕过 extrat($_GET); http://xxx.com?param常见的遍历方式释放变量代码,可能会导致变量覆盖。 $$K 特别注意被覆盖变量$chs = ''; if ( $_POST && $charset != 'utf-8'){ $chs = new Chinese('UTF-8',$charset); foreach ($_POST as $ ket => $value){ $$key = $chs->Convert($value); } } 提交参数chs,可以覆盖 $chs 的值 import_request_variables变量覆盖 import_request_variables(G); 函数会将GET、POST、Cookie中的变量导入到全局。 http://www.xxx.com/x.php?autgparse_str() 变量覆盖 用于解析URL中的 query string,但是当参数值能被用户控制时,很可能导致覆盖。mb_parse_str() 变量覆盖,类似与parse_str函数代码执行
preg_replace(/select/,"",$sele);
http://xx.com/a.php?param=selectselect preg_replace(/select/e," G E T [ ′ c m d ′ ] " , _GET['cmd']", GET[′cmd′]",sele); phpversion5.4.45 第一个参数后加e会造成第二个参数命令执行 也可以构造第一个参数 加e造成执行漏洞,例如:/e http://xxx.com/a.php?cmd=assert(phpinfo()😉;
parse_str() ,session 执行漏洞。CVE-2011-2506
eval()函数
assert() payload : 123') phpinfo();#
system()
exec()
shell_exec()
passthru()
escapeshellcmd();
pcntl_exec()
动态函数执行 param=system&argument=uname
${`ls`} ,若能够控制 ls ,或者输出${`ls`} 可以导致执行。 13**. 回调函数**执行
unserialize()