代码审计

信安数学基础课看代码审计,第二部分8.2神奇的字符串一节。

很多时候报错信息会泄露一些敏感信息,比如说路径位置、代码、变量等(注意到,要想看到错误信息,php配置文件中的php.ini中要设置display_errors=on或者加入一些函数),其中很多时候我们网页中使用绝对路径来标记某个资源,当比如php语句出错了,而服务器有php解析功能并且也打开了刚才提到的设置,那么我们在网页中是会看到报错信息的,信息很有可能就包含有绝对路径。

因为我自己写php代码放在服务器上运行的时候,由于代码错误,比如“”少了某一个或者少了分号,网页就提示了我代码哪一行有问题,同时还给出了绝对路径。 那么就顺着这个部分继续看看能学到些什么,像我前段时间看《代码审计》的时候多次看到关于截断技术,比如在sql宽字节注入部分那。对%00、%25、%27有点印象


php内置的一些过滤函数
1、sql注入的过滤函数:addslashes()、mysql_real_escape_string()、mysql_escape_string()
他们的作用都是给字符串加上反斜杠“\”来转义:单引号(‘)、双引号(“”)、反斜杠(\)、以及空字符NULL。但是他们可能存在宽字节绕过的问题,

2、xss过滤函数:htmlspecialchars()、strip_tags()这两个函数
htmlspecialchars():将特殊字符转成html实体编码,如
&转成&
“转成"
‘转成'
<转成&lt;
>转成&gt;
能干掉很多xss攻击——————————
strip_tags():用来去掉HTML和PHP标记,如传入“<h1>xxxxxxxx</h1>”会得到“xxxxxxx”

3、命令执行过滤函数:
通常执行系统命令注入会用到 || 以及 & 等字符,为防止系统命令注入有:
escapeshellcmd():过滤 如; & * ( ) [ ] \x0A \xFF等
escapeshellarg():给所有参数加上双引号(”)强制为字符串


关于加密方式:
1.对称加密
2.非对称加密
3.单向加密(不可逆的)如MD5
【目前全球公开的最大md5网站:cmd5.com 解密率全球第一】
php的MD5函数:md5() 传入字符串就能得到结果
SHA-1用的比较少,相对MD5可能更加安全


业务功能安全;
[设计的时候考虑到安全十分关键!]
如下一些功能点帮助减少逻辑层面的漏洞问题:

一.验证码
防止撞库神器,但是80%以上的验证码存在爆破或者简单识别,所以应该设计好一点的验证码

我们来看看验证码的绕过:
1.不刷新直接绕过:
当一个web页面登陆操作的验证码能够多次使用,说明后端接收到一次请求之后不会去主动刷新验证码。大的业务使用负载均衡,验证码和session时捆绑在一起的,也就是会把验证码明文或者密文放在post包里。所以只要同一个数据包里的两个验证都对的上就能绕过

2.暴力破解
如果没有设置时间限制或者次数限制,那么就能爆破

3.机器识别
不是实时生成的:
把全部验证码文件保存,做一个图片的md5库,利用的时候直接匹配服务器端返回的图片md5
实时生成的:
要做图片文字识别或者语音识别。云速公司提供类似功能。

4.打码平台
就是人工。。。。

措施:
应对这些问题,首先也是最重要的是要验证输入的次数,避免暴力;不把验证码放在html或者cookie里;验证码设置为只能请求一次,不管结果如何都必须刷新;验证码要加入多样干扰;要动态生成,不能统一生成多次调用。

验证码资源滥用(危害)
短信轰炸,邮箱轰炸:很多工具利用大量网站的短信验证接口,这些接口没有限制获取验证码次数和时间间隔,因此可以被不断的调用。
【措施】限制单个手机号请求短信的次数,限制某个ip请求次数


二.用户登录
跟权限相关,是个很重要的功能点
1.撞库漏洞
登录口不做次数验证,导致可以使用不同的用户和密码来尝试暴力破解,遍历用户。
a.用户名和密码错误无限制
b.一个时间段内用户的密码错误次数限制
c.一个时间段内ip登录错误次数限制


API登录
以qq邮箱、qq空间免密登录为例子
只要拿到clientkey就可以登录当前qq号,此时需要注意
1.登陆密钥clientkey需要不可预测和不固定,生成算法要加入随机数
2.API接口jin’zhi搜索引擎收录
3.登陆密钥绑定当前登陆的主机,换了机器不可用,为了防止qq木马和嗅探key;


三.用户注册

防范恶意:
1.验证码
2.采集机器码,限制次数
3.根据账号格式拉黑
4.防止sql、xss


四.密码找回
密码找回是逻辑漏洞出现最多的一个功能,常见有邮箱、手机号短信找回、密保问题等。
找回密码三大流程,问题
1.输入用户名邮箱、手机
试着抓包修改手机、邮箱参数,如果没有做后端验证,那么验证码就会发到攻击者手上,攻击者就会重置密码。
2.填写验证码和填写新的密码阶段
a.验证凭证过于简单,可以被暴力破解
b.验证的算法过简单,可以被猜测
c.验证凭证直接保存在源码里
3.发送新密码阶段
凭证未绑定用户,改包把参数直接改成攻击者想到的密码
——–

措施:
1、接收验证码的邮箱和手机直接从数据库读取
2、加强验证难度
3、限制错误次数
4、验证凭证失效时间
5、凭证不要保存在页面
6、验证凭证要跟用户名、用户id、用户邮箱绑定,找回密码的时候要验证当前凭证是否是当前用户的

五.资料查看与修改
这主要涉及到个人隐私问题以及权限问题
1.未验证用户权限:
比如id为111的用户修改url为222可以查询222的信息
2.未验证当前登录用户:
xss就利用用户的cookie、或者从post、get获取id,当修改就相当于冒用身份。


防御:
1.绑定用户id与资源id,只允许有权限的用户查看
2.当前用户信息传给session

六.投票、积分、抽奖
利用:
1.cookie或post’请求正文绕过:
找到一些标志,如isok=1代表抽过了,改包isok=0就能绕过
2.基于ip验证:
伪造ip,或者用网上的更改ip的服务达到每次请求用不同ip的效果
3.基于用户的认证:

防御:
1.绑定机器吗
2.操作需要登录,信息要从session获取

七.支付充值
防御:
1.保证数据可信,商品的单价,总价不能从客户端获取
2.购买数量不能小于等于零
3.账户支付锁定机制,当一个支付操作开始立刻锁定用户。

八.私信和反馈
因为互动性可能会诱使管理员点到含xss的数据,管理员cookie被窃取


九.远程地址访问
wordpress、phpcmsd等有远程地址获取资源的功能,容易有ssrf
防御:关注短链接

十.文件管理
增删改查上传下载,哪个都能被利用,要是我的博客被拿下,黑客给我挂马,那么别人访问我博客的时候就是受害人中招的时候。
应对方法:
1.禁止写入脚本可在服务端执行的文件:
比如网站可以解析php,就要限制,不能操作.php扩展名的文件,不能操作php标签的代码
2.限制文件管理功能的操作的目录:
明确功能,限制只能操作的目录。当遇到需要进行目录跳转, 禁止提交 ../ 以及 \.. 避免越权操作其他目录
3.限制文件管理功能访问权限:
4.黑白名单限制上传的文件格式

十一.数据库管理
防御:
1.限制可以操作的数据表
2.限制可以备份到服务器上的文件名

十二.命令、代码执行
命令执行和代码执行的功能一般在系统后台,加上文件管理和数据库管理就构成了webshell的功能。
防御:
1.严格控制该功能的访问权限
2.在可以满足业务需求前提下,设置针对命令的白名单,使用escapeshellcmd()和escapeshellarg()来过滤,命令写死在代码里的话最好
3.给命令、代码执行设置独立密码
4.代码执行功能限制脚本可访问路径
5.限制当前执行命令的系统用户权限

十三.文件、数据库备份
容易出现的问题:
1.非授权访问、越权访问
2.备份文件名可以预测
3.生成的文件可以利用web中间件解析漏洞执行代码

防御:
1.权限控制
2.文件名随机生成,不可预测

十四.API
API返回的形式一般有JSON、序列化、base64编码等
防御:
1.访问权限控制
2.防止敏感信息泄露


应用安全体系建设

企业安全防御:横向细化策略、纵深策略

横向细化:能杀一个是一个,依靠规则的数量来填补空洞,但是提高了攻击和防御的成本

纵深策略:假设上一层防御失效而设计的内网防御策略

1.用户密码安全:
要求强密码
禁止密码与用户名相同或者相似

2.前后用户表分离

3.后台地址隐藏
【工具:御剑】扫描网站目录,原理应该也是基于字典的爆破。
应对:
后台目录不能固定(即修改默认的文件名)
最小权限原则

4.密码加密保存

5.登陆限制
1)限制登录ip
2)双因素认证

6.API站库分离
不是简单的web服务器和数据库服务器分开,而是指调用api的方式调用数据
在web与数据库之间加一台api服务器,数据库配置只允许api服务器访问。然后监控api接口,当发现频繁被用可能就存在刷库行为。

7.慎用第三方

8.严格的权限控制

9.敏感操作多因素验证