mysql注入新姿势(数字与字符编码注入) hex,conv

0x01 前言 

今天看到师傅们发的一篇文章,感觉mysql注入还能这么用,于是自己搭建了一个简单的环境,进行复现.

0x02原理

首先介绍两个mysql函数 hex和conv

conv(N,from_base,to_base) conv函数接收一个数字,进行进制转换

如上图就是将25从16进制转化成10进制,我们复原的结果同样也证实了这样的猜想

hex(str) 将str转化成16进制 
unhex  复原

所以我们可以通过语句将字符串转换成数字   先将test转换成16进制,再转换成10进制

由于Mysql的特性 导致输入的字符串的最大长度为8个字节,超过会导致不能成功解码

这时候我们可以用substr来截取

 

0x03 复现

demo1

 1 <?php
 2 $id= $_GET['x'];
 3 $conn = mysql_connect('127.0.0.1','root','root'); 
 4 mysql_select_db('flag',$conn);
 5 $sql = "select name from flag where id=$id";
 6 $result = mysql_query($sql);
 7 while($row = mysql_fetch_array($result)){     
 8     echo $row['name'];
 9 }  
10 mysql_close($conn);
11 echo "<hr>";   
12 echo $sql
13 ?>

一个简单的sql注入

 

自己在本地编写好payload代码

成功利用 

demo2 update注入中关闭显错

首先介绍一篇文章 利用insert,update和delete注入获取数据

 1 <meta charset="utf-8"/>
 2 <?php
 3 $conn = mysql_connect("localhost","root","root")or die("error".mysql_error());
 4 $db = mysql_select_db("test");
 5 mysql_query("set name utf8");
 6 $id = @$_GET['id'];
 7 $username = @$_GET['username'];
 8 $sql1 = "update users set username='$username' where id ='$id'";
 9 $sql2 = "select * from users where id = '$id'";
10 mysql_query($sql1);
11 if($result = mysql_query($sql2)){
12     $row = mysql_fetch_array($result);
13     echo "ID".$id."的用户变为".$row['username'];
14     mysql_close();
15 }
16 else{
17     var_dump(mysql_error());
18 }
19 ?>

 

在mysql开启报错的时候,可以使用几种报错函数得到结果 payload之一

:?id=1&username=wakakaka' or extractvalue(1,concat(0x7e,database())) or'

就可以得到数据。

如果开启了报错可以用conv hex来得到数据

 Mysql注入博大精深,以后还有很多姿势需要学习

参考 mysql绕过新思路

   在Update的注入中如果关闭了显错该怎么办  

感谢作者提供的思路

转载需注明原文地址 http://www.cnblogs.com/Mrsm1th/p/6842300.html

posted @ 2017-05-11 19:55  Mrsm1th  阅读(5499)  评论(1编辑  收藏  举报