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绕过新思路
感谢作者提供的思路
keep hacking keep coding