Web安全——逻辑漏洞
短信炸弹
漏洞描述
短信轰炸攻击是常见的一种攻击,攻击者通过网站页面中所提供的发送短信验证码的功能处,通过对其发送数据包的获取后,进行重放,如果服务器短信平台未做校验的情况时,系统会一直去发送短信,这样就造成了短信轰炸的漏洞。
漏洞挖掘
1、手工找到有关网站注册页面,认证页面,是否具有短信发送页面,如果有,则进行下一步。
2、通过利用burp或者其它抓包截断工具,抓取发送验证码的数据包,并且进行重放攻击,查看手机是否在短时间内连续收到10条以上短信,如果收到大量短信,则说明存在该漏洞。
风险评级
1、可对任意手机号轰炸判定为高风险
2、只可对当前手机号轰炸或单个手机号码做了限制,但变换手机号码仍然可以不断发送的,判定为低风险。
漏洞修复
1、合理配置后台短信服务器的功能,对于同一手机号码,同一验证发送次数不超过5-10次,且对发送时间间隔做限制
2、当发送超过一定次数(可以为0),加入验证码验证。
邮件炸弹
漏洞描述
应用系统未限制邮件的发送次数和频率,造成短时间内大量邮件发送至接收者邮箱,造成大量垃圾邮件。
漏洞挖掘
手工找到有关网站注册页面,认证页面,是否具有邮件发送页面,如果有,则进行下一步
通过利用burp或者其它抓包截断工具,抓取发送邮件的数据包,并且进行重放攻击,查看邮箱是否在短时间内连续收到10封以上邮件,如果收到大量邮件,则说明存在该漏洞
风险评级:
可对任意邮箱轰炸,判定为高风险。
只可对当前邮箱轰炸,判定为低风险。
漏洞修复
合理配置后台邮件服务器的功能,对于同一邮箱,同一验证发送次数不超过5-10次,且对发送的时间间隔做限制。
当发送超过一定次数(可以为0),加入验证码验证。
条件竞争漏洞
“竞争条件”是什么?
竞争条件发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。
开发者在进行代码开发时常常倾向于认为代码会以线性的方式执行,但是他们忽视了并行服务器会并发执行多个线程,就会导致意想不到的结果。
线程同步机制确保两个及以上的并发线程或者线程不同时执行某些特定的程序段,也被称之为临界区,如果没有应用好同步技术则会发生“竞争条件”问题。
条件竞争漏洞
条件竞争漏洞其实也就是当同时并发多个线程去做同一件事,导致处理逻辑的代码出错,出现意想不到的结果。
条件竞争漏洞一般出现在与数据库系统频繁交互的位置,例如,金额同步、支付等敏感操作处。另外条件竞争漏洞也会出现在其他位置,例如文件的操作处理等。
例子1:银行提现
假设现有一个用户在系统中共有2000元可以提现,他想全部提现。于是该用户同时发起两次提现请求,第一次提交请求提现2000元,系统已经创建了提现订单但还未来得及修改该用户剩余金额,此时第二次提现请求同样是提现2000元,于是程序
在还未修改完上一次请求后的余额前就进行了余额判断,显然如果这里余额判断速度快于上一 次余额修改速度,将会产生成功提现的两次订单,而数据库中余额也将变为-2000。而这产生的后果将会是平台多向该用户付出2000元。
实例:这是upload-labs上面的一个题,题目代码如下:
<?php $is_upload = false; $msg = null; if(isset($_POST['submit'])){ $ext_arr = array('jpg','png','gif'); $file_name = $_FILES['upload_file']['name']; $temp_file = $_FILES['upload_file']['tmp_name']; $file_ext = substr($file_name,strrpos($file_name,".")+1); $upload_file = UPLOAD_PATH . '/' . $file_name; if(move_uploaded_file($temp_file, $upload_file)){ if(in_array($file_ext,$ext_arr)){ $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext; rename($upload_file, $img_path); $is_upload = true; }else{ $msg = "只允许上传.jpg|.png|.gif类型文件!"; unlink($upload_file); } }else{ $msg = '上传出错!'; } } ?>
这里是先move_uploaded_file函数将上传文件临时保存,再进行判断,如果不在白名单则unlink删除,在的话就rename重命名,所以这里存在条件竞争。
用burp开启两个intruder模块,一个用于重复上传,另一个用于重复访问。
1:先上传1.php文件,抓包,放到intruder模块中
2、然后访问我们上传文件后的路径,抓包,也放到intruder模块中
3、设置这两个intruder的payloads,payload type设置为Null payloads,然后设置访问次数。
4、同时放两个intruder模块,可以看到,访问了50000次,最后只有四次成功了。其他的访问次数里,有小部分是状态码返回200。大部分返回404
越权漏洞
越权漏洞是Web应用程序中一种常见的安全漏洞。该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查(比如说修改数据包的值,或者直接访问其他用户相应页面的链接),访问或者操作其他用户或者更高权限用户才能访问到的页面或数据。
越权分为水平越权和垂直越权:水平越权指的是攻击者越权访问到了一个和他拥有相同权限用户的资源,而垂直越权指的是一个低级别用户访问到了一个高级别用户的资源。
越权漏洞的挖掘
在实际的代码安全审查中,这类漏洞往往很难通过工具进行自动化检测,因为必须通过人工判断,人工判断必须先分析当前网站处理业务的逻辑,通过拦截数据包进行业务逻辑判断,判断数据包中的各个参数的意义。
请求中不存在参数,只用cookie进行身份验证,不可越权
请求中存在参数,并且参数中的某些值可能是辨别信息的唯一值(如employeeID,ID等),则可能存在越权
检测水平越权
打开两个浏览器,分别用普通用户登录
查看每个页面的链接,抓包分析其参数的意义,找到与用户名有关的参数,修改成其他用户,重放,看能否访问。如果能访问,则存在水平越权。
检测垂直越权
打开两个浏览器,一个浏览器用超级管理员admin身份登录,一个浏览器用普通用户身份登录
仔细对比两个浏览器之间,那些页面是管理员用户独有的,然后复制链接到普通用户浏览器打开,或者抓包分析包的结构然后篡改重放,看能否访问。如果能访问,则存在垂直越权。
越权漏洞的修复
●服务器端必须对每个页面链接进行权限判断
●用户登后,服务器端不应再以客户端提交的用户身份信息为依据,而应以会话中服务端保存的已登陆的用户身份信息为准
●页面提交的资源标志与已登陆的用户身份进行匹配比对,然后判断其对当前链接是否有权限
●必须在服务器端对每个请求URL进行鉴权,而不能仅仅通过客户端的菜单屏蔽或者按钮Disable来限制