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 <?php2 $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 "
";12 echo $sql
13 ?>
表
一个简单的sql注入
自己在本地编写好payload代码
成功利用
demo2 update注入中关闭显错
1
2 <?php3 $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注入博大精深,以后还有很多姿势需要学习
感谢作者提供的思路