VNO中文网

重返未来1999荒原新增主题是什么... 8047-67-4... 编程基础 | PHP代码审记(下)... FEG 过渡到币安智能链 (BSC)... word有个空白页怎么删除不了(word文档里有个空白页怎么删不掉)...
领取MOLI红包
栏目分类

热点资讯
ETHS中文网

你的位置:VNO中文网 > ETHS中文网 > 编程基础 | PHP代码审记(下)

编程基础 | PHP代码审记(下)

发布日期:2025-01-03 19:15    点击次数:142

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!本专题文章导航1.编程基础 | PHP代码审计(上):红日 新书上线了红日安全推出的适合新手入门系列教程专刊上线啦!红日安全专注新手入门教程。转眼间红日安全又成长了一岁,在这一年里,团队成长了很多很多。目前团队所有的文章对外都是公开的,希望可以给新手一个填补空白的地方。2020年,团队开始新的方向,和一些安全培训厂商进行合作,希望做出更多安全作品。感谢团队每一位成员为团队的辛勤付出,希望每一个人在团队里面有更大的作为。也感谢一直在后面默默支持我们的红粉,也祝愿你们在新的一年学到更多的干货!1.1.5  PHP安全缺陷1.1.5.1 PHP 常见安全配置1.1.5.1.1  php的安全模式php的安全模式是个非常重要的内嵌的安全机制,能够控制一些php中的函数,比如system(),同时把很多文件操作函数进行了权限控制,也不允许对某些关键文件的文件,比如/etc/passwd,但是默认的php.ini是没有打开安全模式的,我们把它打开:safe_mode = on1.1.5.1.2  php脚本能访问的目录使用open_basedir选项能够控制PHP脚本只能访问指定的目录,这样能够避免PHP脚本访问不应该访问的文件,一定程度上限制了phpshell的危害,我们一般可以设置为只能访问网站目录:open_basedir = D:/usr/www1.1.5.2 关闭危险函数如果打开了安全模式,那么函数禁止是可以不需要的,但是我们为了安全还是考虑进去。比如,我们觉得不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看php信息的phpinfo()等函数,那么我们就可以禁止它们:disable_functions =system,passthru,exec,shell_exec,popen,phpinfo,escapeshellarg,escapeshellcmd,proc_close,proc_open,dl,show_source,get_cfg_var如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作disable_functions =chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown以上只是列了部分不叫常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,就能够**大部分的phpshell了。1.1.5.3 关闭注册全局变量在PHP中提交的变量,包括使用POST或者GET提交的变量,都将自动注册为全局变量,能够直接访问这是对服务器非常不安全的,所以我们不能让它注册为全局变量,就把注册全局变量选项关闭:register_globals = Off当然,如果这样设置了,那么获取对应变量的时候就要采用合理方式,比如获取GET提交的变量var,那么就要用$_GET['var']来进行获取,这个php程序员要注意。1.1.5.4  magic_quotes_gpc 来防止  SQL 注入SQL注入是非常危险的问题,小则网站后台被入侵,重则整个服务器沦陷,所以一定要小心。php.ini中有一个设置:magic_quotes_gpc = Off这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换,比如把 ' 转为 \'等,这对防止sql注射有重大作用。所以我们推荐设置为:magic_quotes_gpc = On 1.1.6  代码审计入门1.1.6.1 代码审计工具所有的代码审计工具只能辅助我们进行漏洞发现,由于现在代码审计工具逻辑漏洞是无法发现,只能靠人工进行源代码审计。审计套路网上也比较多。大概方法分为以下几种:工具+人工法审计主要是根据代码审计工具进行函数遍历正则匹配,另加上人工对漏洞敏感度进行查找。代码通读法主要是根据代码整体逻辑进行漏洞挖掘,这样耗费时间比较大,但是可以挖到比较有价值的漏洞。还有一些商业化工具,这里暂且不讲。讲一下本漏洞经常用的几款比较免费功能强大的工具。SeayPHP使用方法:直接新建项目,把源代码拖到里面即可。下载地址:https://pan.baidu.com/s/1i3Jw2uL#list/path=/具体使用方法:https://jingyan.baidu.com/article/54b6b9c0f77e0c2d583b47b1.htmlCobra程序界面操作方法:直接安装即可使用,如果安装麻烦,程序也给出docker安装方式。直接利用docker安装即可。审计效果:说明文档:附加说明:一般工具都会有一些规则,作为一名安全研究人员,你可以多看看一些开源工具的源码。另外此工具也有一些规则,你可以看一下工具的规则,来提高代码审计。另外我们的函数都是采取工具截取,给大家进行演示。我们随便摘取一个,方法是漏洞利用的正则。Rips使用截图:使用起来比较简单,直接上传源代码即可。作为一个静态审计工具,在审计能力方面我们发现这款工具还是可以。也可以定位到相关函数。下载地址:https://sourceforge.net/projects/rips-scanner/files/额外说明:大家可以利用此工具进行源码审计,然后利用手工进行函数查找,漏洞复现等操作。BurpBurp本身就是一个神奇。不仅可以配合源代码审计,也可以进行Web渗透测试等操作。此工具团队已经进行详细说明,大家可以参团队博客进行参考使用。BadCode工具截图:此工具主要是利用subline3插件进行漏洞查找和利用。下载地址:https://github.com/pwnsdx/BadCodeŸ  VulHint subline3插件安全规则:l  Linux系统大家在渗透测试工程中,避免会遇到Linux系统,如果遇到了Linux系统,而且系统也不可以外连,也没有权限进行下载。那这个时候该怎么办?如果遇到这种情况,我们可以利用Linux系统本身的查找命令进行源代码审计。加入我们有入侵了一个Linux系统,在相关目录里面我们发现了一套源码。然后利用此命令进行代码审计。发现可疑函数进行渗透测试。Ÿ  XSS漏洞grep -Ri "echo" .grep -Ri "\$_" . | grep "echo"grep -Ri "\$_GET" . | grep "echo"grep -Ri "\$_POST" . | grep "echo"grep -Ri "\$_REQUEST" . | grep "echo"发现好多函数里面都用echo这个命令。通过这个显示符,我们可以去查看一些配置函数。Ÿ  命令执行grep -Ri "shell_exec(" .grep -Ri "system(" .grep -Ri "exec(" .grep -Ri "popen(" .grep -Ri "passthru(" .grep -Ri "proc_open(" .grep -Ri "pcntl_exec(" .看到这些函数应该就可以去尝试一下漏洞Ÿ  代码注入grep -Ri "eval(" .grep -Ri "assert(" .grep -Ri "preg_replace" . | grep "/e"grep -Ri "create_function(" .Ÿ  SQL注入grep -Ri "\$sql" .grep -Ri "\$sql" . | grep "\$_"Ÿ  信息泄露grep -Ri "phpinfo" .Ÿ   Debug调式grep -Ri "debug" .grep -Ri "\$_GET['debug']" .grep -Ri "\$_GET['test']" .Ÿ   RFI/LFIgrep -Ri "file_include" .grep -Ri "include(" .grep -Ri "require(" .grep -Ri "require(\$file)" .grep -Ri "include_once(" .grep -Ri "require_once(" .grep -Ri "require_once(" . | grep "\$_"Ÿ     Miscgrep -Ri "header(" . | grep "\$_"grep -Ri '$_SERVER["HTTP_USER_AGENT"]' .Ÿ  文件类型grep -Ri file_get_contents .对于Linux系统源代码审计,方法多种多样,只是小编经常采用这用方式来进行源代码审计。对整体代码逻辑性非常锻炼人。1.1.7  代码审记函数理解我们根据cobra规则,我们总结了一些PHP常见漏洞威胁函数。其它工具的规则你可以进行查看。比如我们去查看一下Badcode里面的一些检查规则,发现也类似。所以先学习代码审计,你可以先学习一下PHP常见威胁函数有哪些,然后在查看这些函数是如何调用的,最后整体进行漏洞挖掘。工具进行测试,也可以手工加工具进行测试。最后结果漏洞发现,不管采用哪种方式,你都可以达到一个上升。Ÿ  注入敏感函数selectfrom 、mysql_connect、mysql_query、mysql_fetch_*、update、insert、delete(案例1)为了讲解这些常用函数,临时写了一个HRvul小靶场进行漏洞练习。参考了部分安全靶场。首先看注入源码部分<?phpif(isset($_GET['Submit'])){// Retrieve data$conn=mysql_connect("localhost","root","root",3306);mysql_select_db("hrexp",$conn);inject_checking(strtolower($_SERVER['QUERY_STRING']));$id = $_GET['id'];$getid = "SELECT * FROM users WHERE id = $id";print_r($getid);$result = mysql_query($getid) or die('<pre>' . mysql_error() .'</pre>'  );echo "<br/>";print_r(mysql_fetch_array($result));对query_string传过来字符进行检查inject_checking函数,我们在看一下这个函数有哪些操作<?phpfunction inject_check($str) { //防注入函数开始$check=preg_match('/select|order|insert|update|eval|document|delete|injection|jection|link|and|or|from|union|into|load_file|outfile|<script>/',$str);if($check){echo"<script>alert('Filtered!!!');window.history.go(-1);</script>";exit();}else{return  $str;}}对常见函数都进行检查,我们看看能不能进行绕过,可以直接对常见函数进行编码既可以绕过。(2)案例2<?php$dbuser = "root";$dbpwd = "";$db = "test";//这里是mysql的密码$conn = mysql_connect("localhost",$dbuser,$dbpwd)  ordie("error");mysql_select_db($db,$conn);$id = $_GET['id'];$query = "select * from test where id =$id";$result = mysql_query($query) or die(mysql_error());print_r(mysql_fetch_array($result));这里我们用到了mysql_query这个函数。由于$id参数在传参过程中没有进行修饰,直接传给了MySQL。造成了注入。(3)案例3Simple Down 简单下载系统 v5.4从源码状态来看,应该没过滤直接mysql_query或者过滤不严格。文章地址:-2013-037204.htmlŸ  宽字节注入setnamesgbk、character_set_client=gbkmysql_set_charset('gbk')、iconv宽字符是指两个字节宽度的编码技术,如UNICODE、GBK、BIG5等。当MYSQL数据库数据在处理和存储过程中,涉及到的字符集相关信息包括:Ÿ  character_set_client:客户端发送过来的SQL语句编码,也就是PHP发送的SQL查询语句编码字符集。character_set_connection:MySQL服务器接收客户端SQL查询语句后,在实施真正查询之前SQL查询语句编码字符集。Ÿ  character_set_database:数据库缺省编码字符集。Ÿ  character_set_filesystem:文件系统编码字符集。Ÿ  character_set_results:SQL语句执行结果编码字符集。Ÿ  character_set_server:服务器缺省编码字符集。Ÿ  character_set_system:系统缺省编码字符集。Ÿ  character_sets_dir:字符集存放目录,一般不要修改。宽字节对转义字符的影响发生在character_set_client=gbk的情况,也就是说,如果客户端发送的数据字符集是gbk,则可能会吃掉转义字符\,从而导致转义消毒失败。例子3就是一个存在宽字符注入漏洞的PHP程序。<?php$name=$_GET['name'];$name=addslashes($name);$conn=mysql_connect('localhost','root','root');if($conn==null){exit("connect error !<br>");}mysql_query("SET NAMES 'gbk'",$conn);mysql_select_db("hongri",$conn);$sql="select * from hongrisec where name='".$name."'";$result=mysql_query($sql,$conn);while($val=mysql_fetch_row($result)){print_r($val);print("<br>");}?>产生漏洞代码我们已经利用黄色底纹已经标出来,主要数据库编码采用了gbk编码,导致了宽字节注入。POC如下?name=a

上一篇:没有了

下一篇:8047-67-4

Powered by VNO中文网 @2013-2022 RSS地图 HTML地图

Copyright Powered by站群 © 2013-2024