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繞過新思路
感謝作者提供的思路