freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

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

php代码审计-xss与csrf
hehehe111 2021-10-16 20:37:24 128629

前言

跨站脚本攻击(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方式获取了客户端的输入值以后直接又输出回去。没有做任何过滤。

注入尝试

1633962546_61644a32256512f3c7071.png!small?1633877880090

构造的注入语句<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账户

登录成功,点击有注入代码的留言界面

执行这个网页执行成功去数据库查看账号和密码都已经创建成功。

# xss # web安全 # csrf # php代码审计
免责声明
1.一般免责声明:本文所提供的技术信息仅供参考,不构成任何专业建议。读者应根据自身情况谨慎使用且应遵守《中华人民共和国网络安全法》,作者及发布平台不对因使用本文信息而导致的任何直接或间接责任或损失负责。
2. 适用性声明:文中技术内容可能不适用于所有情况或系统,在实际应用前请充分测试和评估。若因使用不当造成的任何问题,相关方不承担责任。
3. 更新声明:技术发展迅速,文章内容可能存在滞后性。读者需自行判断信息的时效性,因依据过时内容产生的后果,作者及发布平台不承担责任。
本文为 hehehe111 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
hehehe111 LV.2
这家伙太懒了,还未填写个人描述!
  • 4 文章数
  • 11 关注者
php代码审计-文件上传
2021-10-22
php代码审计-sql注入进阶篇
2021-10-10
php代码审计-sql注入初级篇
2021-09-29
文章目录