PHP安全过滤

以下是PHP5.2的函数filter_val。提供对特殊字符的过滤。


SQL注入最简单形式 1’ or '1'='1,括号补全的话,还可以1’or '1'='1  )) 

注释形式:1' or  '1'='1'; -- ,简化形式就是1' or  1=1; -- 

前面两种形式是骗过SQL执行,

union all select * from test; -- 帮助查询一些信息出来,完整形式:551' or  '1'='1')) union all select * from test; -- 

同时,为了知道查询某个表使用了几个字段可以用select 1,1,1代替,如下

551' or  '1'='1')) union all select 1,1,1,1,1; -- 

如果是5个1,说明该语句从数据表中查询5个字段的值,

再然后就是推测有哪些表名,比如user表什么的,在select 1,1,1,1,1 from 表名;里来一个一个测试,只要发现成功,就说明表名是存在的

下一步就是获得表的字段名,猜测出名字后就用substring来获得名字的某些字段

php文档中对sql注入有专门提到,需要注意

笔者尝试在mysql_query中同时执行查询和插入命令,以失败告终;说明mysql_query只执行单一操作,php在mysql多类型sql语句比其他数据库有安全性;



OWASP提供的过滤机制

https://www.owasp.org/index.php/OWASP_PHP_Filters


addslashs的作用是对部分字符转移,但和magic_quotes_gpc在作用上重合,当magic_quotes_gpc为on时,php会自动对GET、POST 和 COOKIE 数据进行addslashs。


网上建议针对字符集,采用mysql_real_escape_string

http://www.jb51.net/article/21903.htm


对类型转移可以用ctype系列,ctype_alpha、ctype_digit等。


正则表达式匹配


XSS过滤可以用htmlentities



.

漏洞无非这么几类,XSS、sql注入、命令执行、上传漏洞、本地包含、远程包含、权限绕过、信息泄露等
   1.xss + sql注入
  其中占大头的自然是XSS与SQL注入,对于框架类型或者有公共文件的,建议在公共文件中统一做一次XSS和SQL注入的过滤。写个过滤函数,可由如下所示:
  $_REQUEST = filter_xss($_REQUEST);
  $_GET = filter_xss($_GET);
  $_POST = filter_xss($_POST);
  $_COOKIE = filter_xss($_COOKIE);
  $_POST = filter_sql($_POST);
  $_GET = filter_sql($_GET);
  $_COOKIE = filter_sql($_COOKIE);
  $_REQUEST = filter_sql($_REQUEST);
  这里有一点需要说明,$_REQUEST虽然等于$_GET+$_POST,但他们是独立的数组,也就是说假设改变了$_GET的值,但$_REQUEST的值还是原来的值,所以过滤时都不能落下,至于其他的如$_FILE之类的就可忽略了。
  最简单的filter_xss函数是htmlspecialchars()
  最简单的filter_sql函数是mysql_real_escape_string()
  当然,谁都知道这种过滤filter_sql只能过滤字符型和搜索型的注入,对于数字型是没有办法的,但也说明做了这层过滤后,只需在后面注意数字型的SQL语句就可以了,遇到了加intval过滤就可以了,这就变得容易多了。
  2. 命令执行
  对于命令执行,可以从关键字入手,总共可分为3类
  (1) php代码执行 :eval等
  (2)shell命令执行:exec、passthru、system、shell_exec等
  (3) 文件处理:fwrite、fopen、mkdir等
  对于这几类需要注意其参数是否用户可控。
  3.上传漏洞
  对于上传漏洞,也是重点关注的地方,要仔细分析它的处理流程,针对上传的绕过方式是很多的,最保险的方式:在保存文件是采用文件名随机命名和后缀白名单方式。其次要注意的一点是上传文件的地方可能不止一处,不要有遗漏,可能会碰到这样的情况,突然在某个目录里面包含了一个第三方的编辑器在里面。
  文件包含漏洞涉及的函数如include() 、include_once()、require()、require_once()、file_get_contents()等
  最常见的还是出在下载文件功能函数,例如download.php?file=///etc/passwd 这种类型中。
  4. 权限绕过
  权限绕过可分为两类吧
  (1)后台文件的未授权访问。后台的文件没有包含对session的验证,就容易出现这样的问题
  (2)未作用户隔离,例如mail.php?id=23显示了你的信件,那么换个ID, mail.php?id=24就查看到了别人的信件,编写代码是方便,把信件都存在一个数据表里,id统一编号,前端展现时只需按id取出即可,但未作用户隔离,判定归属,容易造成越权访问。
  这样的例子是很常见的,给某银行做评估是就经常发现这种漏洞。
  5. 信息泄露
  信息泄露算是比较低危的漏洞了,比如列目录这种就属于部署问题,而与代码审计无关了,而像暴路径、暴源码这种是需要防止的。曾经遇到这样的代码
  <?php if(empty($_GET['a'])) {…} ?>
  表面上似乎没问题,可是当请求变为 xx.php?a[]=1时,即参数变为数组的时候,就会发生错误以致路径泄露,而用isset判断则不会,当然一个个防太麻烦,建议在配置文件中关闭错误提示,或者在公共文件中加入如下代码以关闭错误显示功能:
  <?php error_reporting(0);?>
  当然,漏洞远不止这些,其他如cookie伪造、CSRF等非主流的就不介绍了。


参考:

http://blog.csdn.net/myron_sqh/article/details/16924299


XSS攻击:

在firefox可用,chrome下不可用

http://www.cnblogs.com/bangerlee/archive/2013/04/06/3002142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值