文章归档

置顶文章

Web安全

Web安全基础

PHP相关

Writeups

靶机系列

HackTheBox

VulnHub

代码审计

PHP代码审计

流量分析

机器学习

基础学习

Python

Python编程

Java

Java编程

算法

Leetcode

随笔

经验

技术

 2019-10-30   1.3k

Web安全学习之各种注入类型的环境搭建和代码编写

  1. 编写常规回显注入的代码,在之前搭建的环境中测试是否正常;
  2. 编写报错注入的代码,并做相应的服务器配置来满足条件,并测试代码是否正常;
  3. 编写盲注的代码,在之前的搭建环境中测试是否正常;
  4. 编写宽字节注入的代码,并做相应的服务器配置来满足条件,并测试代码是否正常。

0x01 回显注入

回显注入主要的是将查询的内容输出到页面上,这样报错才能回显信息。

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
<?php
echo '<h1>';
echo 'Test ErrorBased Injections';
echo '</h1>';
error_reporting(E_ALL ^ E_DEPRECATED);

// Connect database
$conn=mysqli_connect('localhost', 'root', '******');
if (!conn)
{
echo 'Failed to connect to MySQL:'.mysqli_error($conn);
}
else
{
echo 'Success to connect to MySQL';
}
echo '<hr>';
mysqli_select_db($conn, 'security') or die ("Unable to connect to the database: security");
mysqli_query($conn, 'set names utf-8');

// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
}

// query sql

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo 'SQL query:'.$sql;
echo '<hr>';
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row)
{
echo 'Your Login name:'.$row['username'];
echo '<hr>';
echo 'Your Password:'.$row['password'];
}
?>

0x02 报错注入

报错注入的原因是mysql_error这个函数导致的,作用是返回上一个mysql操作产生的文本错误信息。
报错注入的前提:页面上没有显示位,但是有sql语句执行错误信息输出。

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
<?php
echo '<h1>';
echo 'Test ErrorBased Injections';
echo '</h1>';

// Connect database
$conn=mysqli_connect('localhost', 'root', '******');
if (!conn)
{
echo 'Failed to connect to MySQL:'.mysqli_error($conn);
}
else
{
echo 'Success to connect to MySQL';
}
echo '<hr>';
mysqli_select_db($conn, 'security') or die ("Unable to connect to the database: security");
mysqli_query($conn, 'set names utf-8');

// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
}

// query sql

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo 'SQL query:'.$sql;
echo '<hr>';
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row)
{
echo 'Your Login name:'.$row['username'];
echo '<hr>';
echo 'Your Password:'.$row['password'];
}
else
{
print_r(mysqli_error($conn));
}
?>

0x03 盲注

盲注前提:没有显示位,也没有输出SQL语句执行错误,只显示页面正常和不正常。要有个empty函数来判断是否为空,否则and 1=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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
echo '<h1>';
echo 'Test Bool-Blind Injections';
echo '</h1>';

// Connect database
$conn=mysqli_connect('localhost', 'root', '******');
if (!conn)
{
echo 'Failed to connect to MySQL:'.mysqli_error($conn);
}
else
{
echo 'Success to connect to MySQL';
}
echo '<hr>';
mysqli_select_db($conn, 'security') or die ("Unable to connect to the database: security");
mysqli_query($conn, 'set names utf-8');

// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
}

// query sql

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo 'SQL query: '.$sql;
echo '<hr>';
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row)
{
echo 'You are in.........';
echo '<br>';
}
else
{
echo '';
}
?>

时间盲注

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
<?php
echo '<h1>';
echo 'Test Bool-Blind Injections';
echo '</h1>';

// Connect database
$conn=mysqli_connect('localhost', 'root', '******');
if (!conn)
{
echo 'Failed to connect to MySQL:'.mysqli_error($conn);
}
else
{
echo 'Success to connect to MySQL';
}
echo '<hr>';
mysqli_select_db($conn, 'security') or die ("Unable to connect to the database: security");
mysqli_query($conn, 'set names utf-8');

// take the variables
if(isset($_GET['id']))
{
$id=$_GET['id'];
}

// query sql

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo 'SQL query: '.$sql;
echo '<hr>';
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row)
{
echo 'You are in.........';
echo '<br>';
}
else
{
echo 'You are in.........';
echo '<br>';
}
?>

和布尔盲注不同的是,不论怎么输入,回显的信息都是相同的。

0x04 宽字节注入

宽字节前提是数据库中采用gbk的编码方式。

如果存在宽字节注入,我们输入%df%27时,经过转译变成了%df%5c%27(%5c是反斜杠\),之后在数据库查询前由于使用了GBK多字节编码,即在汉字编码范围内两个字节会被编码为一个汉字。然后MySQL服务器会对查询语句进行GBK编码即%df%5c转换成了汉字“運”(具体见GBK的汉字编码范围见附录),而单引号逃逸了出来,从而造成了注入漏洞。

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
<?php
echo '<h1>';
echo 'Test ErrorBased Injections';
echo '</h1>';
error_reporting(E_ALL ^ E_DEPRECATED);

// Connect database
$conn=mysqli_connect('localhost', 'root', '*****');
if (!conn)
{
echo 'Failed to connect to MySQL:'.mysqli_error($conn);
}
else
{
echo 'Success to connect to MySQL';
}
echo '<hr>';
mysqli_select_db($conn, 'security') or die ("Unable to connect to the database: security");
mysqli_query($conn, 'set names gbk');

// take the variables
if(isset($_GET['id']))
{
$id = addslashes($_GET['id']);
}

// query sql

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
echo 'SQL query:'.$sql;
echo '<hr>';
$result=mysqli_query($conn, $sql);
$row=mysqli_fetch_array($result, MYSQLI_BOTH);
if ($row)
{
echo 'Your Login name:'.$row['username'];
echo '<hr>';
echo 'Your Password:'.$row['password'];
}
?>

Copyright © ca01h 2019-2020 | 本站总访问量