
基础注入命令速查表:从入门到上手
核心查询命令详解
刚开始学注入,最绕的就是“该用哪个命令”。其实你可以把注入想象成“和数据库聊天”——你发一句“暗号”,数据库回你一串信息,能不能聊得起来,全看暗号对不对。我整理了5个新手必学的核心命令,用表格列出来会更清楚,这也是我带新人时必让他们抄的“作弊表”:
命令格式 | 核心功能 | 适用场景 | 避坑要点 |
---|---|---|---|
SELECT 字段名 FROM 表名 |
查询数据库中的具体数据 | 信息收集阶段,获取表名、字段名 | 需配合闭合符号(如’、”),新手常漏写 |
UNION SELECT 1,2,3 |
联合查询,合并多个查询结果 | 获取数据库版本、用户等系统信息 | 前后查询列数需一致,可先用ORDER BY n 测列数 |
ORDER BY n |
按第n列排序,用于判断查询列数 | 注入前的信息探测 | n从1开始递增,直到报错则列数为n-1 |
AND 1=1/1=2 |
布尔盲注,判断条件真假 | 页面无明显回显时使用 | 1=1时页面正常,1=2时异常,通过对比判断 |
WAITFOR DELAY '0:0:5' |
时间盲注,让数据库延迟响应 | 布尔盲注失效时,通过延迟判断注入点 | 延迟时间不宜过长,避免被目标系统检测 |
你别小看这个表格,我去年帮一个刚入行的朋友整理时,他一开始觉得“记命令就行,表格没用”,结果实操时不是漏了UNION查询的列数匹配,就是ORDER BY试到第5列还没报错(其实列数是3),折腾一上午没进展。后来我让他把表格打印出来,贴在屏幕旁边,每个命令标红“注意事项”,比如“UNION前必须测列数”,他下午测试时直接对着表格一步步来,半小时就成功跑出了数据库版本号。
这里插一句,这些命令不是孤立的,得像搭积木一样组合着用。比如你想查数据库名,正确流程应该是:先用ORDER BY 3
确定列数是3→再用UNION SELECT 1,database(),3
把数据库名“塞”到第2列显示→最后用+
注释掉后面多余代码(就像你说话说到一半,加个“后面的不用管了”,避免数据库报错)。我刚开始学的时候,总忘了加注释符,结果命令后半段被当成正常查询执行,页面直接显示“语法错误”,后来养成习惯,每次输完命令都检查有没有+
或#
,错误率一下子降了80%。
基础注入流程与命令搭配
可能你会说“命令我记住了,但面对一个网址,还是不知道从哪下手”。其实注入就像解谜,得按步骤来,我 了个“四步走”流程,你可以直接套用:
第一步是“找注入点”。通常网址里带?id=1
这种参数的地方,就是潜在注入点(比如http://test.com/show.php?id=1
)。你可以先把id=1
改成id=1'
,如果页面报错“语法错误”,说明存在字符型注入;如果页面没变,试试id=1 and 1=2
,页面异常则可能是数字型注入。我之前测一个教育网站,参数是?page=3
,试了page=3'
没反应,换page=3 and 1=2
后页面空白,马上确定是数字型注入,后面就好办多了。
第二步是“信息探测”。知道注入点后,就得搞清楚目标数据库的“家底”:有多少列、用的什么数据库(MySQL还是SQL Server)、当前用户权限。这时候ORDER BY
和UNION SELECT
就派上用场了。比如你输入id=1 order by 4+
,页面报错,再试order by 3+
页面正常,就知道查询结果有3列;接着用id=-1 union select 1,version(),user()+
(把id改成-1让前面查询为空,只显示UNION的结果),页面上就能看到数据库版本(比如5.7.36)和当前用户(比如root@localhost)。
第三步是“数据读取”。知道数据库版本和列数后,就可以读具体数据了。如果是MySQL数据库,系统表information_schema
里存着所有表名和字段名,你可以用UNION SELECT 1,table_name,3 FROM information_schema.tables WHERE table_schema=database()+
,把所有表名读出来;找到像users
这种可疑表,再用UNION SELECT 1,username,password FROM users+
,就能拿到账号密码。我之前帮一个企业做内部测试时,就是用这个方法从admin
表读到了管理员密码,当时那个密码还是明文存的,把对方安全负责人吓了一跳。
第四步是“收尾与验证”。拿到数据后别急着结束,最好用布尔盲注或时间盲注再验证一遍,避免误判。比如你读到密码是123456
,可以用id=1 and password='123456'+
,如果页面正常,说明密码正确。这里提醒一句,测试时一定要在授权范围内进行,未经允许的渗透是违法的,这一点你千万要记住。
进阶注入技巧:绕过防御与实战应用
常见防御绕过命令调整
你可能会遇到这种情况:明明按步骤注入,却总提示“非法字符”或“请求异常”——这说明目标系统装了WAF(Web应用防火墙),在拦截你的注入命令。这时候别慌,WAF也不是万能的,稍微调整一下命令格式就能绕过,我 了3个亲测有效的小技巧:
第一个是“关键字变形”。很多WAF会拦截SELECT
、UNION
这类关键词,你可以用大小写混写(比如SeLeCt
、uNiOn
)、加空格或特殊符号(比如SEL ECT
、UNION//SELECT
,//
在SQL里相当于空格)。我之前测一个电商网站,直接输UNION SELECT
被拦截,改成UNION//SeLeCt
后就成功了,WAF对这种变形识别率很低。
第二个是“编码绕过”。如果变形不管用,可以试试URL编码,把关键字转换成%加ASCII码(比如S
编码成%53
,E
编码成%45
)。你可以用浏览器自带的开发者工具,在“网络”面板里找到请求,右键“编辑并重新发送”,把命令编码后再发送。我遇到过一个WAF只拦截明文SELECT
,但对%53%45%4C%45%43%54
(SELECT的URL编码)完全没反应,轻松绕过。
第三个是“注释符替换”。默认的+
或#
注释符可能被拦截,这时候可以用/ /
块注释,比如UNION SELECT 1,2,3/
,或者在命令中间插注释SEL/test/ECT
(/test/
会被数据库忽略,不影响命令执行)。有次我用+
一直报错,换成/
后发现页面正常,后来才知道对方WAF专门监控这个符号,换个注释符就解决了。
这里要提醒你,绕过技巧不是一成不变的,得根据WAF的拦截规则灵活调整。OWASP(开放Web应用安全项目)的SQL注入防御指南里提到,“没有万能的绕过方法,需结合目标环境测试”,你可以去看看他们的详细说明(OWASP SQL注入防护指南,注意这只是学习参考,别用于未授权测试)。
实战场景中的命令选择策略
不同的测试场景,适合的命令也不一样,选对了能事半功倍。我把常见场景和对应命令整理成了“决策树”,你可以对着选:
如果页面有明显回显(比如直接显示查询结果),优先用UNION SELECT
联合查询,效率最高;如果页面没回显,但输入1=1
和1=2
时页面有差异(比如一个显示“登录成功”,一个显示“账号错误”),用布尔盲注AND 1=1/1=2
;如果连布尔盲注都没反应,页面不管输入什么都长得一样,就用时间盲注WAITFOR DELAY
或SLEEP(5)
(MySQL用SLEEP,SQL Server用WAITFOR),通过观察页面加载时间判断注入是否成功。
举个例子,我之前测一个政府网站的内部系统(授权测试),页面特别“干净”,不管输入什么参数,返回的都是“查询成功”或“查询失败”,没有具体数据。这种情况布尔盲注就派上用场了:我用id=1 AND length(database())>5+
,页面显示“查询成功”(说明数据库名长度大于5);再试>8
,页面“查询失败”,很快确定数据库名长度是6-8位,接着用SUBSTRING(database(),1,1)='a'
逐个猜字符,花了20分钟就把数据库名“govsys”猜出来了。
还有个小细节,测试时尽量用短命令,避免太长的语句被WAF当成“异常请求”。比如你想查所有表名,别一上来就写超长的SELECT table_name FROM information_schema.tables...
,可以先查第一个表名SELECT table_name FROM information_schema.tables LIMIT 0,1
,拿到一个再查下一个,分段执行更安全。我有次贪方便,写了个一次查10个表名的命令,结果被WAF判定为“批量攻击”,IP直接被封了半小时,后来学乖了,一次只查一个,再也没出过问题。
最后再啰嗦一句,注入技术只是网络安全的“敲门砖”,真正重要的是理解背后的原理——你得知道“为什么这个命令能生效”,而不是死记硬背。我当初学的时候,对着一个UNION SELECT
命令拆了半小时,把每个单词的作用搞清楚,后来遇到变种命令也能举一反三。如果你跟着这篇文章的步骤试了,不管成功还是遇到问题,都欢迎回来留言告诉我,咱们一起讨论怎么解决!
注入命令执行后总是报错,可能是什么原因?
新手执行注入命令时常见报错,大多和“细节没到位”有关。比如文章表格里提到的“闭合符号遗漏”——如果目标是字符型注入点(比如网址参数带单引号),你输入SELECT命令时没加’或”闭合,数据库会认为语法不完整,直接报错;另外“列数不匹配”也很常见,用UNION SELECT时前后查询的列数必须一样,比如前面查3列,后面UNION查4列,就会提示“列数不同”。还有注释符没加对,比如该用+时写成了#(部分环境不支持#),也会导致命令后半段被执行而报错。 执行前先对照文章里的“避坑要点”检查一遍,能少走很多弯路。
MySQL和SQL Server的注入命令有什么主要区别?
虽然基础逻辑相通,但不同数据库的命令细节有差异,新手容易搞混。比如时间盲注时,MySQL用SLEEP(5)(让数据库延迟5秒响应),而SQL Server要用WAITFOR DELAY ‘0:0:5’;查询系统表时,MySQL依赖information_schema(存表名、字段名),SQL Server则用sysobjects和syscolumns;注释符方面,MySQL支持+和#,SQL Server主要用或/ /。文章里提到的UNION SELECT、ORDER BY这类基础命令在两种数据库通用,但涉及系统信息查询或延迟操作时,一定要先确认目标数据库类型(可以用UNION SELECT version(),1,1查MySQL版本,用UNION SELECT @@version,1,1查SQL Server版本),避免用错命令。
如何快速判断一个网址是否存在注入点?
找注入点可以按“三步走”,亲测对新手很友好。第一步看网址参数,比如?id=1、?page=3这种带数字或字符的参数,都是潜在目标;第二步改参数值测试:先试字符型注入点——把id=1改成id=1’(加单引号),如果页面显示“SQL语法错误”“未闭合的引号”,大概率是字符型;如果没反应,试数字型注入点——把id=1改成id=1 and 1=2,如果页面从“正常显示”变成“无内容”或“错误提示”,说明存在数字型注入点;第三步用“真假条件对比”验证,比如id=1 and 1=1页面正常,id=1 and 1=2页面异常,就能确认注入点有效。刚开始练手时,可以从简单的?id=1类网址入手,熟练后再尝试更复杂的参数。
新手刚开始学注入,有哪些必记的基础命令?
不用贪多,先把这5个核心命令记牢,就能应对80%的入门场景,对应文章表格里的“核心查询命令”:
3. UNION SELECT 1,2,3:联合查询,获取系统信息或数据;
4. AND 1=1/1=2:布尔盲注,没回显时判断条件真假;
5. SLEEP(5)(MySQL)/WAITFOR DELAY ‘0:0:5’(SQL Server):时间盲注,通过延迟判断注入是否成功。
记的时候别死记格式,结合“适用场景”理解——比如ORDER BY是“测列数的尺子”,UNION SELECT是“拼结果的胶水”,这样记得更牢。
测试时不小心触发了目标网站的防御机制,该怎么办?
如果页面突然显示“非法请求”“访问受限”,甚至IP被暂时封禁,别慌,先暂停测试,这很可能是触发了WAF或网站的基础防护。这时候可以先记录下刚才执行的命令(比如是不是用了SELECT这种敏感词),等几分钟后换个简单的命令重试,比如把SELECT改成SeLeCt(大小写混写),或者在关键词中间加空格(SEL ECT),大部分基础防御对这种变形识别率不高。如果还是不行,试试文章里提到的URL编码,把命令里的字母换成%+ASCII码(比如S换成%53),通过浏览器开发者工具的“网络”面板重发请求。 测试必须在授权范围内进行,未经允许的渗透不仅会触发防御,还可能触犯法律,这一点一定要牢记。