笔记

代码审计SQL注入漏洞

SQL注入的类型

在这里插入图片描述
字符型注入是有单引号的

1
SELECT *  FROM users WHERE  id='$id';

数字型注入是没有单引号的

1
SELECT *  FROM users WHERE  id=$id;

这个前面博客有写

预防

addslashes()函数在每个双引号(”)前添加反斜杠
代码

1
2
3
 <?php 
$a=$_GET['a'];
echo addslashes($a);

在这里插入图片描述

代码审计宽字节注入及二次注入

宽字节注入

  1. 字符、字符集与字符序
    字符( character)是组成字符集( character set)的基本单位。对字符赋予一个数值( encoding)来确定这个字符在谤字符集中的位置。
    字符序( collation)指同一字符集內字符间的比较规则。
  2. UTF8
    由于AsC表示的字符只有128个,因此网络世界的规范是使用 UNICODE编码,但是用ASC表示的字符使用 UNICODE并不高效。因此出现了中间格式字符集,被称为通用转换格式,及UTF
    (Universal Transformation Format)
  3. 宽字节
    GB2312、GBK、GB18030、BG5、 Shift jIs等这些都是常说的宽字节,实际上只有两字节。宽字节带来的安全问题主要是吃ASC字符(一字节)的现象

sql预防

addslashes()函数在每个双引号(”)前添加反斜杠
代码

1
2
3
 <?php 
$a=$_GET['a'];
echo addslashes($a);

在这里插入图片描述

addslashes()写一个预防sql查询

  1. a.html文件

    1
    2
    3
    4
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
       <title>登陆</title>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    5. a.php文件,加上了`addslashes()`函数字符转义

    ```php
    <?php
    $id=addslashes($_GET['id']);
    $s = "192.168.0.105";
    $u= "root";
    $p = "";

    // 创建连接
    $conn = mysqli_connect($s, $u, $p);
    // 检测连接
    if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
    }
    echo "数据库连接成功"."<br/>";

    mysqli_select_db($conn,'dvwa');
    $a="SELECT last_name,password FROM users WHERE user_id='$id'";
    $b=mysqli_query($conn,$a);
    while ($DuQu=mysqli_fetch_assoc($b)) {
    echo "\"".$DuQu['last_name']."\"".$DuQu['password']."<br/>";
    }

    echo "-------------------------------------------"."<br />";
    echo "<br/>"."你的sql查询语句是<br/>".$a."<br/>";

    //关闭数据库
    mysqli_close($conn);
    ?>
    演示一下、 ![在这里插入图片描述](https://img-blog.csdnimg.cn/202007100808548.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710080909920.png) 现在我输入`'`会被转义了,无法sql注入
1
1 ' union select user(),2 -- 
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710081917161.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200710081938454.png)

绕过addslashes()进行sql注入

  1. 宽字节注入
    也就是逃避单引号注入
    输入%df
    下面这个是个中文应为没有编码就乱码了在这里插入图片描述

二次注入

二次注入就是,叫注入的数据写入到数据库,然后通过写入到查询语句进行查询
编写一个简单的注册,和查询页面

在这里插入图片描述
可以看见还是能过滤掉的
在这里插入图片描述
但是写入数据库里面\就没有了
在这里插入图片描述

代码审计之代码执行漏洞

就是通过php函数执行系统的命令,比如cmd,shell

挖机思路

  1. 用户输入的内容能够控制函数
  2. 存在输入可执行代码的危险函数

常见的危险的函数

1. eval()和assert()函数

这两个函数将输入的字符串当做代码来执行

  1. eval()函数
    执行代码
    代码
1
2
3
<?php
eval($_GET['cmd']);
?>
URL`xxxxxxx?cmd=phpinfo();` ![在这里插入图片描述](https://img-blog.csdnimg.cn/2020071210350041.png) 执行系统函数,来执行系统命令 URL`xxxxx?cmd=system('ipconfig');` ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200712104126675.png)
  1. assert()函数和eval()效果是一样的
    代码xxxxxxx?cmd=phpinfo();

    1
    2
    3
    4
    <?php
    assert($_GET['cmd']);

    ?>

    URL
    在这里插入图片描述

call_user_func()回调函数

1
call_user_func(要调用的自定义函数名,自定义函数参数)

代码

1
2
3
4
5
6
7
8
<?php
function call(){

$a=$_GET['cmd'];
eval($a);
}
call_user_func('call',$a);
?>

URLxxxxxxx?cmd=phpinfo();
结果

在这里插入图片描述

常见的回调函数
call_user_func_array() ,array_map()等等

动态执行函数

函数与函数之间互相被调用可能就会出现漏洞

  1. 定义一个函数
  2. 将函数名(字符串)赋值给一个变量
  3. 使用变量名代替函数名动态调用函数

代码

1
2
3
4
5
6
7
8
<?php
function c($arg){
$arg();
}

$a=$_GET['a'];
c($a);
?>

URLxxxxx?a=phpinfo
在这里插入图片描述

PHP 正则表达式

也可以说是规则表达式

  1. PHP preg_match_all() 函数
    1. 这个是普通字符
    函数用于执行一个全局正则表达式匹配
    格式
1
preg_match_all(要搜索的模式(字符串形式),输入字符串,结果保持多维数组)
咧 代码 下面的代码的意思是 在变量`$b`查看里面有多少个`abc`
1
2
3
4
5
6
7
<?php
$a="/abc/";
$b="dsadaabcsdasdabcdas";
preg_match_all($a,$b,$c);
var_dump($c);

?>
结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714205759676.png) **2.特殊字符**

代码执行的类型

  1. 代码的过滤的不严
  2. 系统的漏洞造成命令注入
  3. 调用第三方的组件存在执行代码执行漏洞

命令执行常见的函数

  1. system()函数
    格式
1
system(要执行的命令,则外部命令执行后的返回状态将会被设置到此变量中)
咧 代码
1
2
3
4
<?php
$a=$_GET['cmd'];
system($a);
?>
URL`xxxx?cmd=ipconfig` 结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714213040878.png) URL`xxxx?cmd=echo 222>a.txt` 结果 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714213451402.png)
  1. passthru()函数
    system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存而passthru()函数获取一个命令未经任何处理的


    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php


    $a = $_GET['cmd'];

    echo "<pre/>";
    passthru($a);
    echo "<pre/>";

    ?>

    结果
    在这里插入图片描述

  2. exec()函数
    函数执行系统命令和
    函数是PHP中的内置函数,用于执行外部程序并返回输出的最后一行。如果没有正确运行命令,它也返回NULL
    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php

    echo "<pre>";
    $a = $_GET['cmd'];

    echo exec($a,$file);
    echo "</br>";
    print_r($file);

    echo "<pre/>";

    ?>

    结果
    他应为用的用的是echo输出的只能输出一行
    在这里插入图片描述

  3. shell_exec()函数
    shell_exec()函数是PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出。shell_exec是backtick操作符的别名,用于*nix。如果命令失败,则返回NULL,并且这些值对于错误检查不可靠。

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php

    $a = $_GET['cmd'];

    echo "<pre>";
    echo shell_exec($a);
    echo "<pre/>";

    ?>

    结果
    在这里插入图片描述

  4. ``反引号
    与shell_exec是一样的,就是用的shell_exec函数

    代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php

    $a = $_GET['cmd'];

    echo "<pre>";
    echo `$a`;
    echo "<pre/>";

    ?>

    结果
    在这里插入图片描述

过滤和预防函数

1. 过滤

  1. escapeshellcmd()函数
    这个函数是过滤整条命令的,他会叫符号前面加上^

    代码
1
2
3
4
5
<?php
$a=escapeshellcmd($_GET['cmd']);
system($a);
echo "<br/>".$a;
?>
结果 他不会叫222写入到a.txt文件里面 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714215800959.png) ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200714215830301.png)
  1. escapeshellarg()函数
    将给字符串增加一个单引号并且能引用或者转码任何已经存在的单引号,这样以确保能够直接将一个字符串传入 shell 函数,并且还是确保安全的

    代码
    1
    2
    3
    4
    5
    <?php
    $a=escapeshellarg($_GET['cmd']);
    system($a);
    echo "<br/>".$a;
    ?>
    结果
    在这里插入图片描述
     ![在这里插入图片描述](https://zssnp-1301606049.cos.ap-nanjing.myqcloud.com/img/20200714215830301.png)

代码审计之XSS漏洞

XSS漏洞的危害

  1. 盗取用户的cookie
  2. 跳转的钓鱼网站
  3. 蠕虫
  4. 查看浏览器信息

1.反射型XSS

非持久性XSS,也叫反射性XSS,通过GET和POST方法,向股务器端输入数据。用
户输入的数据通常被放置在URL的 query string中,或者是form数据中,如果服务
器端对输入的数据不进行过滤,验证或编码,就直接将用户输入的信息直接星瑙给
客户,则可能会造成反射型XSS
反射型XS是比校昔遍的XSS,其危害程度遹常被认为较小,但是某些反射型
XSS造成的后果会很严重,如在输入框的name中输入metahttp
equI’ refresh’ content=”5’/>,殷务器不加处理,将name的值直接送到浏
器,则浏岚器会每5秒自动新一次严重者会导致服务器崩溃

  1. 测试
    代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
    <title>测试XSS测试</title>
    </head>
    <body>

    <h1>请输入</h1>
    <form action="" method="post">
    <input type="text" name="fname">
    <input type="submit" value="提交">

    <?php
    if(isset($_POST['fname'])){
    $a=$_POST['fname'];
    echo "<br/>"."你输入的是:".$a;
    }else{
    }
    ?>
    </body>
    </html>
    在这里插入图片描述
    输入什么他就返回什么,没有进行过滤
    我们输入<script>alert('a')</script>
    可以看到在web页面上被执行了
    在这里插入图片描述
  2. 闭合xss
    代码
    1
    2
    3
    4
    5
    6
    7
    8
    <?php  
    $a=$_GET['a'];
    ?>

    <script>
    var xss='<?php echo $a; ?>';
    document.write(xss);
    </script>
    代码介绍
    <script> 标签用于定义客户端脚本,比如 JavaScript,上面就是js代码
    var是定义一个xss变量,里面是’
    write() 方法可向文档写入 HTML 表达式或 JavaScript 代码,上面的就是叫输出出来
    上面这个其实存在xss漏洞的
    URL
1
http://127.0.0.1/a.php?a=123';</script><script>alert('a')</script>
URL介绍 `</script>`s使用来闭合前面的 `<script>alert('a')</script>`就可以执行了![在这里插入图片描述](https://img-blog.csdnimg.cn/20200717160132832.png)

存储型XSS

持久型,也叫存储型XSS。通常是因为服务器端将用户输入的恶意脚本没有通过
验证就直接存储在数据库,并且毎次通过调用数据库的方式,将数据呈现在浏览器
上。则该XSS跨站脚本攻击将一直存在。若其他用户访问该页面,则恶意脚本就会
被触发,用于盗取其他用户的私人信息。

  1. 测试
    代码
    写入数据库
    文件a.php

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    <!DOCTYPE html>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>登陆</title>
    </head>
    <body>
    <form action="" method="post">
    请输入ID:<input type="text" name="id"><br/>
    要保存的内容:<input type="text" name="user"><br/>
    <input type="submit" value="点击"/>
    </form>


    <?php
    if(isset($_POST['id'])&&isset($_POST['user'])){
    $id=$_POST['id'];
    $user=$_POST['user'];
    $s = "127.0.0.1";
    $u= "root";
    $p = "123456";

    // 创建连接
    $conn = mysqli_connect($s, $u, $p);
    // 检测连接
    if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
    }

    mysqli_select_db($conn,'xss');

    $a="INSERT INTO user VALUES ($id,$user)";

    if(mysqli_query($conn,$a)){
    echo "创建成功".'<br/>';
    }else{
    echo "创建失败"."<br/>";
    }


    mysqli_close($conn);
    echo "关闭成功";

    }else{

    }
    ?>


    </body>
    </html>

    存储的内容如下
    在这里插入图片描述
    查看一下数据库已经存入到数据库里面了
    在这里插入图片描述

  2. 输出数据库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    	<?php
    $s = "127.0.0.1";
    $u= "root";
    $p = "123456";

    // 创建连接
    $conn = mysqli_connect($s, $u, $p);
    // 检测连接
    if (!$conn) {
    die("连接失败: " . mysqli_connect_error());
    }
    echo "连接成功"."<br/>";

    mysqli_select_db($conn,'xss');
    $a="SELECT * FROM user";
    $b=mysqli_query($conn,$a);
    echo "当前数据库有"."<br/>";
    while ($DuQu=mysqli_fetch_assoc($b)) {
    echo "\"".$DuQu['id']."\"".$DuQu['user']."<br/>";
    }


    mysqli_close($conn);
    echo "关闭成功";
    ?>

    可以看到直接就执行js代码了
    在这里插入图片描述

MOD型XSS

DOM,全称 Document Object Model,是一个平台和语言都中立的
接口,可以使程序和脚本能够动态访问和更新文档的内容、结构以及
样式。
DOM型ⅩSS其实是一种特殊类型的SS,它是基于DOM文档对象模
型的一种漏洞。

代码审计之CSRF漏洞

CSRF漏洞介绍

CSRF( Cross- site request forgery)跨站请求伪造,也有人写出XSRF。黑客伪
造用户木匾用户的HTTP请求。然后将这个HTTP请求发送给存在CSRF的网站,有
CSRF的网站执行了伪造的HTTP请求,就引发了跨站请求伪造

挖机思路

后台功能模块:管理后台、会员中心、添加用户等
被引用的核心文件里面有没有验证 token和 referer相关的代码
没带 token:可以直接请求这个页面
没带 Referer:返回相同的数据

学习中