PHP代码审计

    技术2022-07-13  66

    本文参考道哥的《白帽子讲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()

    Processed: 0.009, SQL: 9