当前位置:首页 > 娱乐 > dvwa之sql注入

dvwa之sql注入

2026-10-17 05:45:42 [综合] 来源:力不从心网

DVWA的注入SQL Injection页面,输入框里敲一个 1',注入页面直接甩回来一条MySQL报错。注入这就是注入最原始的注入点——用户输入被拼进SQL语句,数据库把错误信息原样吐给浏览器。注入很多人第一次看到这个报错,注入反应是注入“哦,有注入”,注入但真正该注意的注入是:报错本身说明后端没有做任何过滤,连基本的注入转义都没有。

DVWA默认安全等级是注入Low,源码大概长这样:$id = $_GET['id']; $query = "SELECT first_name,注入 last_name FROM users WHERE user_id = '$id';"。变量直接嵌在单引号里,注入闭合单引号就能改写查询逻辑。注入输入 1' OR '1'='1,注入整张users表的所有记录都会被拉出来。这不是什么高级技巧,就是字符串拼接的必然结果。

我习惯先测列数。 1' ORDER BY 1-- 正常,1' ORDER BY 2-- 正常,1' ORDER BY 3-- 报错,说明查询返回两列。接着用 1' UNION SELECT 1,2-- 确认回显位置,页面上会显示数字1和2,代表两个字段都能输出到前端。把2换成 database(),当前库名就出来了——通常是 dvwa。

有人到这里就停了,觉得拿到库名就算完成。实际渗透中,库名只是起点。DVWA的MySQL版本较老,没有information_schema的限制,可以直接查表:1' UNION SELECT 1,table_name FROM information_schema.tables WHERE table_schema='dvwa'-- 。结果会列出 guestbook 和 users 两张表。users表里有什么?继续查列名:1' UNION SELECT 1,column_name FROM information_schema.columns WHERE table_name='users'-- 。user、password、first_name、last_name,一目了然。

密码字段是MD5存的。DVWA的users表里,admin的密码哈希是 5f4dcc3b5aa765d61d8327deb882cf99,对应明文 password。你可以用 1' UNION SELECT user,password FROM users-- 直接把所有用户名和哈希拖出来,然后丢进cmd5或者hashcat跑。Low级别下,整个过程不需要任何绕过,因为压根没有防护。

切到Medium级别,源码变了:$id = mysql_real_escape_string($id);。单引号被转义,1' 变成 1\',闭合不了。但DVWA的Medium有个特点——前端是下拉框,后端却仍然接受GET参数。用Burp抓包改 id=1' OR '1'='1,发现还是能注入。为什么?因为 mysql_real_escape_string 只转义单引号,不处理数字型注入。如果查询是 WHERE user_id = $id(没有引号包裹),那么 1 OR 1=1 直接生效,压根不需要引号。DVWA Medium的源码里,id确实被单引号包着,但转义函数在特定字符集下可能被绕过,比如GBK宽字节。不过更简单的思路是:Medium的SQL查询用了 mysql_real_escape_string,但没过滤 -- 注释符和 UNION 关键字,所以 1' UNION SELECT 1,2-- 依然能跑通,只是单引号需要处理。实际测试中,Medium级别直接输入 1' UNION SELECT user,password FROM users-- 会失败,因为单引号被转义。但改成 1 UNION SELECT user,password FROM users-- 呢?不行,因为原查询是 WHERE user_id = '1',数字型拼接不成立。所以Medium的注入点其实需要结合Burp改包,利用 1' 被转义后变成 1\',而 \ 在MySQL里是转义符,导致后面的单引号被“吃掉”,查询结构错位。具体利用方式这里不展开,但核心是:转义函数不是万能药。

High级别用了 LIMIT 1 加预处理语句?不,DVWA High的源码是 $id = $_GET['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"。看起来和Low差不多,但页面变成弹窗输入,且只返回第一行。这时候 UNION SELECT 依然可用,只是需要把 LIMIT 1 注释掉或者用 # 截断。输入 1' UNION SELECT user,password FROM users#,注意 # 后面要跟一个空格或者换行,否则可能被浏览器截断。High级别下,回显只有一行,但你可以用 GROUP_CONCAT 把所有用户名密码拼成一列输出:1' UNION SELECT 1,GROUP_CONCAT(user,0x3a,password) FROM users#。这样一次性拿到全部数据。

Impossible级别就不用试了,源码里用了PDO预处理, $stmt->bindParam(':id', $id, PDO::PARAM_INT),输入被强制转成整数,注入点彻底消失。从Low到Impossible,DVWA把SQL注入的防御演进路线摆得很清楚:字符串拼接→转义→限制回显→预处理。每一级的绕过方式不同,但根子都在于“用户输入是否被当作代码执行”。

实际挖洞时,DVWA的报错信息帮了大忙,但真实环境往往关闭了错误回显。那时候就得靠盲注——布尔盲注或者时间盲注。布尔盲注靠页面差异判断真假,时间盲注靠 SLEEP() 延迟。DVWA的Low级别也能测盲注,比如 1' AND SLEEP(5)-- ,页面卡5秒说明注入成功。不过有回显的时候,没人愿意用盲注,太慢。

最后提一句:DVWA的SQL注入页面,输入框里敲 1' 报错,敲 1'-- 正常,这个差异就是注入存在的铁证。别急着上sqlmap,先手动跑一遍,理解每一步为什么能成,比工具跑出来的结果有价值得多。

(责任编辑:娱乐)

推荐文章
  • 安全漏洞中文补丁

    安全漏洞中文补丁 安全漏洞中文补丁 昨天凌晨两点,我盯着屏幕上的报错日志,后背发凉。某个开源库的漏洞利用代码已经出现在公开仓库里,而官方补丁要三天后才发布。这不是第一次了——中文社区里,补丁总是慢半拍,甚至有些漏洞压 ...[详细]
  • html左侧隐藏和折叠栏

    html左侧隐藏和折叠栏 左侧隐藏栏这东西,做起来不难,但做得好的人真不多。我见过太多页面,点一下按钮,侧栏“唰”地滑出来,再点一下,“唰”地缩回去——动画倒是顺滑,可总觉着哪里不对劲。后来想明白了,问题往往出在“隐藏”这件事 ...[详细]
  • 爬虫抓取携程酒店评论

    爬虫抓取携程酒店评论 携程的酒店评论页,是我见过最“结实”的反爬虫堡垒之一。它不像某些小网站那样裸奔,而是层层设卡:字体加密、CSS偏移、滑块验证、IP频率限制,轮番上阵。我花了一个下午,用Python的requests库 ...[详细]
  • 网站漏斗图

    网站漏斗图 网站漏斗图 昨天看后台数据,一个访客在注册页停留了四分钟,填到“公司名称”那栏就关了。这已经是本周第七个卡在同一位置的用户。漏斗图不会告诉你他为什么犹豫,但它会诚实地画出那条陡峭的下降曲线——就像你眼 ...[详细]
  • 渗透漏扫

    渗透漏扫 一个凌晨两点,我的同事老周盯着屏幕骂了一句脏话。他刚跑完一轮全端口扫描,结果里躺着一个445端口的开放记录——那台服务器是三个月前上线的,当时运维拍着胸脯说“防火墙都配好了”。现在它像个没关门的保险库 ...[详细]
  • 上海网站搭建

    上海网站搭建 上海网站搭建这行当,水比黄浦江深。我见过太多老板,花三万块做个官网,上线那天兴冲冲发朋友圈,结果半年后连后台密码都忘了。网站不是名片,是台二十四小时不关门的销售,可惜多数人把它当成了电子墓碑。 去年帮 ...[详细]
  • 信息安全漏洞库

    信息安全漏洞库 信息安全漏洞库:一个没修好的数字潘多拉魔盒 2023年,一个叫MOVEit的文件传输软件曝出漏洞,黑客像开罐头一样轻松撬开数千家企业的数据大门。美国能源部、英国广播公司、壳牌石油,全栽了。事后人们发现 ...[详细]
  • 黑客彩票

    黑客彩票 凌晨三点,我盯着屏幕上的双色球开奖号码,后脑勺一阵发麻。昨晚我用Python写了个爬虫,抓了最近一百期开奖数据,跑了个简单的随机森林模型,它预测的六个红球全中,蓝球差了一个数。中奖金额——零,因为差的 ...[详细]
  • 怎么黑进网赌平台

    怎么黑进网赌平台 网赌平台的后台漏洞,比大多数人想象中要多得多。我去年接触过一个专门做渗透测试的朋友,他接的私活里,有三分之一是帮输急眼的老板“找回场子”——当然,最后都变成了报警材料。真正黑进平台核心数据库的案例极少 ...[详细]
  • kali怎么查看ip地址

    kali怎么查看ip地址 Kali里查IP这事儿,说简单也简单,说坑也坑。你敲个ifconfig,大概率会看到command not found。别慌,这不是你系统坏了,是新版Kali把ifconfig给藏起来了,默认只装ip ...[详细]
热点阅读