温故而知新-DVWA

0x00前言

  最近涉猎docker,用docker搭建了DVWA1.9版本,正好把DVWA又重新测试一遍,记录几点安全方面的感悟

0x01感悟

1.后台爆破

  • 通常的网站采用验证码的方式防止爆破,然而不少网站验证码过于简单,可以利用验证码识别后继续爆破,还有部分网站验证码可以重复使用,导致验证码形同虚设。
  • 较为安全的后台防止爆破可以采用每次请求附带随机token的方式,可以防止不同的burp爆破,不过不能防止利用脚本获取页面后提交爆破。
  • geetest验证码通过机器学习判断是否为人为验证,然后返回一个validate,认证需要带上validate,可以防止简单的脚本爆破和burp爆破
  • 最简单最安全的方式是错误次数限制,达到错误阈值后锁定用(ATM机取款仅仅有6位密码也是通过限制错误次数的保障用户的资金安全。)

2.CSRF

  • CSRF主要应用在用户已登录的情况下,通过诱骗用户点击(或者执行加载)恶意链接,向合法的应用服务以用户的身份发送请求,在缺乏防范的时候造成删除文件、添加用户、修改密码等严重后果。
  • 一般情况通过请求携带Token的方式防止CSRF攻击,不过,当网站存在XSS时:利用XSS获取Token,然后发起CSRF请求也可能导致攻击成功。
  • 防止此类漏洞的有效手段是请求页面带Token,并且在敏感操作时要求再次用户确认(比如输入原始密码,提醒是否确定删除。)

3.命令注入

  • 防止命令注入,主要是严格限定输入满足程序的要求,通过正则匹配满足预定输入(比如ip,必须为数字等),或者通过白名单方式限定输入

4.文件上传

  • 文件上传有通过前端限制、黑名单上传类型限制、验证文件后缀、验证文件头,关键函数过滤等多种常见的方式,然而这些方法总存在绕过的漏洞和威胁,切实有效的方法是通过白名单限制上传的文件类型并在服务器端对文件进行重命名操作。
  • 文件包含漏洞+上传可能导致绕过上传限制机制造成攻击

5.SQL注入之MySQL函数CONCAT,CONCAT_WS,GROUP_CONCAT对比

(1)CONCAT(str1,str2,…)返回结果为连接参数产生的字符串,可以有一个或多个参数。如有任何一个参数为NULL ,则返回值为NULL。

CONCAT

(2)CONCAT_WS(separator,str1,str2,…),返回结果为以separator为分割符的字符串,此函数会忽略参数中的NULL值(如果分割符为NULL,如:select CONCAT_WS(NULL,user_id,last_name,first_name) from users;则返回结果为NULL)

CONCAT_WS

测试CONCAT和CONCAT_WS处理NULL的区别:
将Bob的last_name设置为NULL以后update users set last_name=NULL where user_id=5,比较CONCAT和CONCAT_WS的结果,可以看到CONCAT返回为NULL,而CONCAT_WS只是忽略了NULL的字符部分,其他正常显示

CONCAT VS CONCAT_WS

(3)GROUP_CONCAT([DISTINCT] expr [,expr …][ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] [,col …]][SEPARATOR str_val])函数返回带有来自一个组的连接的非NULL值的字符串,其中为需要将返回结果去重时使用DISTINCT,需要排序是使用ORDER BY,需要制定分割符是用SEPARATOR(默认是’,’)

GROUP_CONCAT

将GROUP_CONCAT联合CONCAT_WS或CONCAT使用(NULL的结果已经被过滤):

dvwa_group_concat4concat_ws

0x02总结

  • 白名单比黑名单安全
  • 最小化限制输入范围(限制只能内网访问比全网访问安全,限制数字比所有字符安全,重命名比采用用户输入文件名更安全)