PHP网络安全笔记

一、MySQL篇

1、常规注入:通常没有任何过滤,直接将参数存放到SQL语句中

2、宽字节注入:

宽字节注入源于程序员设置MySQL连接时错误配置为setcharacter_set_client=gbk,这样配置会引发编码转换从而导致注。
(1)正常情况下,当GPC开启或使用addslashes函数过滤GET或POST提交的参数时,攻击者使用的单引号“”就会被转义为“\”(%5c是反斜杠\),之后在数据库查询前使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。
(2)然后MySQL服务器会对查询语句进行GBK编码,即%df%5c转 换成汉字“運”,而单引号逃逸了出来,从而造成注入漏洞。
(3)但如果存在宽字节注入,我们输入%df%27时,首先经过单引号转义成%df%5c%27
(4) %df\=%df%5c%27在使用GBK编码的时候,会认为%df%5c是一个宽字节%df%5c%27=線',这样就会产生注入。
为了防止宽字节编码出现的参数问题,现在开发者基本上都会选择将MySQL连接配置为setcharacter set _client =binary来解决。

3、二次编码注入:二次编码注入,即二次urldecode注入,是因为使用urldecode不当所引起的漏洞。

在PHP中,常用过滤函数如addslashes()、mysql real escape_ string(、 mysql _escape string()或者魔术引号GPC开关来防止注入,原理都是在单引号()、双引号(")、反斜杠(\)和NULL等特殊字符前面加上反斜杠来进行转义。但是这些函数在遇到urldecode()函数时,都会因为二次解码引发注入。urldecode()函数是对已编码的URL进行解码。引发二次编码注入的原因其实很简单,PHP本身在处理提交的数据之前会进行一次解码。

4、base64编码注入
漏洞成因:大家应该对Base64函数不会陌生,在很多场合都会用来编码解码,一些系统经过前端Base64编码后传入服务器,而服务器接收参数做检测时并没有先解码,因此认为参数是可信的而被攻击者绕过。
例如攻击者传入“1' or '1'='1”的时候,防御模块原本会识别出来,可是参数经过前端的Base64转换后,此参数已变成“MScgb3IgJzEnPScx",此时防御模块已经不能根据关键词分析出此参数的恶意字符了。
作为可逆的编码,在审计过程中,如果遇到Base64_ _deocde函数, 并没有在之后做任何过滤,直接拼接到SQL语句中,就极有可能会导致一个SQL注入漏洞。

5、漏洞的几种类型

1)可显注入:攻击者可以直接在当前界面中获取想要的内容
2)报错注入:数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以借此构造数据库报错语句从报错信息中获取想要的内容
3)盲注注入:盲注是指数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库执行延时等方法获取想要的内容。
3-1)布尔盲注:布尔盲注利用MySQL条件不成立时返回空内容,条件成立时返回正常的数据的特点来进行攻击
3-2)时间盲注:同理,时间盲注通过substr截取字段返回信息的字符,通过-一个个字符推算出最终的数据。和布尔盲注稍微不同的是,时间盲注不是依据页面是否返回空内容来判断是否成立,而是根据响应时间来判断,如果条件成立,页面就会比平时晚5秒钟响应。

检测方法:

1、参数过滤检查
(1)参数接收位置,检查是否有没过滤直接使用$_ GET、$_ POST、$_ COOKIE参数的情况。
(2) SQL语句检查,搜索select、update、 insert等SQL 语句关键词,检查SQL语句的参数是否可以被控制。

2、在URL中寻找注入点
(1)如URL:URL:htp://permeate.localhost/home/index.php?m-tiezi&a- -index&bk=5,尝试在bk- =5参数后面加上一个单引号,然后观察页面是否有明显的变化,URL:htp://permeate.localhost/home/index.php?m-tiezi&a- -index&bk=5',可以看到加上之后页面内容已经明显发生了改变,出现这种现象大多数情况下存在注入点
(2)发现注入点后就用一个工具SQLMap,执行命令:sqlmap.py -u "ttp://permeate.localhost/home/index.php?m=tiezi&a=index&bk=5"

防范方法:

1.结构预处理
由于SQL注入是因为参数改变了SQL语句的原有结构所造成的,因此通过参数绑定可以达到参数是参数,结构是结构,从而避免结构被改变的情况。

2.函数转义
虽然大部分情况下都可以通过底层DB类封装好的方法来操作数据库,比如常见的连贯操作,可是依然会有一部分操作底层是很难满足的,所以依然会存在少部分裸写SQL的情况,这个时候就得使用函数转义来保障SQL语句的结构不被改变,常见的函数有:intval()、addslashes()、mysql_reall_escape_string()

3.参数规则验证:主要通过以下3点来验证。
1)检查用户输入的合法性,确认输入的内容只包含合法的数据。数据检查需要两端全部检查,客户端检查后,服务器端还需要执行一次检查,之所以还需要执行服务器端验证,是为了弥补客户端验证机制脆弱的安全性。
2)限制表单或查询字符串输入的长度。如果用户的登录名字最多只有10个字符,那么不要认可表单中输入的10个以上的字符,这将大大增加攻击者在SQL命令中插入有害代码的难度。
3)检查提取数据的查询所返回的记录数量。如果程序只要求返回一个记录,但实际返回的记录却超过一行,那就当作出错处理。

4.屏蔽错误消息
防范SQL注入还要避免出现--些详细的错误消息,因为攻击者可以利用这些消息。要使用一种标准的输入确认机制来验证所有输入数据的长度、类型、语句、企业规则等,例如:@屏蔽错误信息

5.权限控制
对于用来执行查询的数据库账户,限制其权限。用不同的用户账户执行查询、插入、更新、删除操作,由于隔离了不同账户可执行的操作,因此就防止了原本用于执行SELECT命令的地方却被用于执行INSERT、UPDATE或DELETE命令。

6.代码审查
1)参数检查
2)反向推理
3)宽字节审查:注意是否存在character_set_client=gbk , SET_NAMES 'gbk'  , mysql_set_charset('gbk')
4)URL二次编码:注意是否有使用 urldecode()  rawurldecode()

二、XSS跨站
XSS又叫跨站脚本攻击(Cross Site Script, CSS),为不和层叠样式表(Cascading StyleSheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。它指的是攻击者往Web页面里插入恶意HTML代码,当用户浏览该页时,嵌入Web里面的HTML代码会被执行,从而达到恶意的目的。

XSS攻击利用网站的漏洞从用户那里恶意盗取信息。用户在浏览网站、使用即时通信软件,甚至在阅读电子邮件时,通常会单击其中的链接。攻击者通过在链接中插入恶意代码就能够盗取用户信息。攻击者通常会用十六进制(或其他编码方式)对链接进行编码,以免用户怀疑它的合法性。网站在接收到包含恶意代码的请求之后会产生一个包含恶意代码的页面,而这个页面看起来就像是那个网站应当生成的合法页面一样。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值