DVWA靶场——XSS(DOM) DOM型XSS

DVWA靶场——XSS(DOM) DOM型XSS
XSS全称Cross Site Scripting即跨站脚本攻击为了和前端的CSS区分开所以取名XSS某种意义上也是一种注入攻击是指攻击者在页面中注入恶意的脚本代码当受害者访问该页面时恶意代码会在其浏览器上执行需要强调的是XSS不仅仅限于JavaScript还包括flash等其它脚本语言。根据恶意代码是否存储在服务器中XSS可以分为存储型的XSS与反射型的XSS。DOM—based XSS漏洞是基于文档对象模型Document Objeet ModelDOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口它允许程序或脚本动态地访问和更新文档内容、结构和样式处理后的结果能够成为显示页面的一部分。DOM中有很多对象其中一些是用户可以操纵的如uRIlocationrefelTer等。客户端的脚本程序可以通过DOM动态地检查和修改页面内容它不依赖于提交数据到服务器端而从客户端获得DOM中的数据在本地执行如果DOM中的数据没有经过严格确认就会产生DOM—based XSS漏洞。有关DOM的详细解释可以看这个文档文档对象模型DOM - Web API | MDN这样专业的介绍可能大家一头雾水下面用一段简单的比喻带大家理解一下你开了一家自助打印店网页顾客在电脑上输入想打印的文字URL 参数然后系统自动打印出来显示在页面上。安全做法系统把输入当纯文字打印。有漏洞的做法系统把输入当指令执行。坏人输入“打印1000份并自动装订”系统就真照做了。DOM 型 XSS 就是你的页面把用户输入当成了代码来执行而不是当纯文本展示可能触发DOM型XSS的属性innerHTML把字符串当HTML代码塞进页面塞入img srcx onerroralert(1)图片加载失败就会执行弹窗eval()把字符串当JavaScript代码直接执行塞入alert(攻击)浏览器直接运行毫无防备document.write()在页面中直接写入HTML和innerHTML一样塞恶意标签浏览器照单全收location.hashURL中#后面的部分构造链接xxx.com/#script...用户一点就中招location.searchURL中?后面的参数构造链接xxx.com/?namescript...跟hash一样危险document.referrer用户从哪个页面跳过来的从恶意页面跳转过来referrer里塞攻击代码有关其他DOM型XSS漏洞可以参考大佬写的这篇文章DOM型XSS客户端的攻防战场-CSDN博客这一期的内容我不会讲的很深入其实xss的危害是非常大的危害具体说明严重程度1. 窃取Cookie/会话令牌偷到管理员的登录凭证直接接管账号 极高2. 键盘记录在页面上埋监听器记录用户输入的所有密码 极高3. 内网端口扫描用JavaScript探测内网IP和开放端口摸清网络结构 高4. 钓鱼欺骗伪造登录框骗用户输入密码看着像真的 高5. 劫持功能操作代替用户发帖、转账、改密码以合法身份做坏事 高大概可以这样理解XSS 偷钥匙身份凭证→ 提权 冒充管理员 → 横向移动 拿着钥匙开所有门XSS可能只是个小洞但让有坏心思的人拿到了你家的钥匙整个房子都不安全了这些内容读者会在后续的学习中接触到学习越主动进步就越快Low我们回到靶场中源码分析?php //没有保护什么都没有 # No protections, anything goes ?什么都没有我们直接构造xss尝试弹窗查看页面代码也可以看到xss被插入执行了Medium源码分析?php // Is there any input? // array_key_exists()检查键是否存在 array_key_exists() 函数检查某个数组中是否存在指定的键名如果键名存在则返回 true如果键名不存在则返回 false。 提示如果指定数组的时候省略了键名将会生成从 0 开始并以 1 递增的整数键名 array_key_exists(key,array) key 必需 规定键名。 array 必需。规定数组 if ( array_key_exists( default, $_GET ) !is_null ($_GET[ default ]) ) { $default $_GET[default]; # Do not alLow script tags //过滤script含scriipt的就不可以 stripos() 函数查找字符串在另一字符串中第一次出现的位置不区分大小写 stripos(string,find,start) string 必需 规定被搜索的字符串。 find 必需 规定要查找的字符。 start 可选 规定开始搜索的位置。 返回值 返回字符串在另一字符串中第一次出现的位置如果没有找到字符串则返回 FALSE。注释字符串位置从 0 开始不是从 1 开始。 if (stripos ($default, script) ! false) { //如果参数不含script header() 函数向客户端发送原始的 HTTP 报头 header(string,replace,http_response_code) string 必需 规定要发送的报头字符串。 replace 可选 指示该报头是否替换之前的报头或添加第二个报头。 默认是 true替换。false允许相同类型的多个报头。 http_response_code可选 把 HTTP 响应代码强制为指定的值。PHP 4 以及更高版本可用 header (location: ?defaultEnglish); exit; } } ?简单来说就是过滤掉了“script”当函数匹配到 script 字符串的时候就会将URL后面的参数修正为 ?defaultEnglish注入时会默认跳转到English页面所以我们换一个换一种标签使用img进行尝试成功呼出了弹框并且xss也被写进了页面中High源码分析 ?php // Is there any input? if ( array_key_exists( default, $_GET ) !is_null ($_GET[ default ]) ) { # White list the alLowable languages //白名单只允许French、English、German、Spanish switch ($_GET[default]) { case French: case English: case German: case Spanish: # ok break; default: header (location: ?defaultEnglish); exit; } } ?此处使用了白名单过滤只允许 传的 default值 为 French English German Spanish 其中一个这里只是对 default 的变量进行了过滤所以我们可以考虑在这几个元素后使用或者#连接我们的xss语句如下Englishscriptalert(1)/script English#scriptalert(1)/script好的没问题Impossible源码分析?php # Dont need to do anything, protction handled on the client side ?发现什么也没有在客户端上处理不会在进行URL解码我们输入的参数全部无效了无法实现XSS