UPDATE注射 mysql php 的兩個模式

2021-12-29 16:21:08 字數 3940 閱讀 4307

文/安全天使superhei

一.測試環境:

os: windowsxp sp2

php: php 4.3.10 (

mysql 4.1.9

apache 1.3.33

二.測試資料庫結構:

-----start---

-- 資料庫: `test`

-- --

-- 表的結構 `userinfo`

-- create table `userinfo` (

`groudid` varchar(12) not null default 1,

`user` varchar(12) not null default heige,

`pass` varchar(122) not null default 123456

) engine=myisam default charset=latin1;

-- -- 匯出表中的資料 `userinfo`

-- insert into `userinfo` values (2, heige, 123456);

------end-------

三.測試模式:

1,變數沒有帶或""[mod1]

<?php

mod1

$servername = "localhost";

$dbusername = "root";

$dbpassword = "";

$dbname = "test";

mysql_connect($servername,$dbusername,$dbpassword) or die ("資料庫連線失敗");

$sql = "update userinfo set pass=$p where user=heige";//

$result = mysql_db_query($dbname, $sql);

$userinfo = mysql_fetch_array($result);

echo "

sql query:$sql

";?>

指令碼裡只是修改user=heige的pass,如果groudid表示使用者的許可權等級,我們的目的就是通過構造$p 來達

到修改groupid的目的:

那麼我們提交:

在mysql裡查詢:

mysql> select * from userinfo;

--------- ------- --------

| groudid | user  | pass   |

--------- ------- --------

| 1       | heige | 123456 |

--------- ------- --------

1 row in set (0.01 sec)

使用者heige的groudid又2改為1了 :)

所以我們可以得到沒有或"" update的注射是可以成功的,這個就是我們的模式1。

2,變數帶或""[mod2]

<?php

$servername = "localhost";

$dbusername = "root";

$dbpassword = "";

$dbname = "test";

mysql_connect($servername,$dbusername,$dbpassword) or die ("資料庫連線失敗");

$sql = "update userinfo set pass=$p where user=heige";//

$result = mysql_db_query($dbname, $sql);

$userinfo = mysql_fetch_array($result);

echo "

sql query:$sql

";?>

為了關閉我們構造$p應該為123456,groudid=2 提交:

在gpc=on的情況下變成了

提交的語句變成:sql query:update userinfo set pass=123456,groudid=1 where user=heige

mysql查詢:

mysql> select * from userinfo;

--------- ------- --------------------

| groudid | user  | pass               |

--------- ------- --------------------

| 2       | heige | 123456,groudid=1 |

--------- ------- --------------------

1 row in set (0.00 sec)

groudid並沒有被修改。那麼在變數被或""時 就完全沒有被注射呢?不是 下面我們看模式2:

<?php

mod2

$servername = "localhost";

$dbusername = "root";

$dbpassword = "";

$dbname = "test";

mysql_connect($servername,$dbusername,$dbpassword) or die ("資料庫連線失敗");

$sql = "update userinfo set pass=$p where user=heige";//

$result = mysql_db_query($dbname, $sql);

mysql_fetch_array($result);    //$p的資料寫入資料庫

$sql= "select pass from userinfo where user=heige";

$result = mysql_db_query($dbname, $sql);

$userinfo=mysql_fetch_array($result);

echo $userinfo[0];  //把pass查詢輸出給$userinfo[0]

$sql ="update userinfo set pass=$userinfo[0] where user=heige";

$result = mysql_db_query($dbname, $sql);

mysql_fetch_array($result); //把$userinfo[0] 再次update

我們測試下,提交:

回mysql查詢下 :

mysql> select * from userinfo;

--------- ------- --------

| groudid | user  | pass   |

--------- ------- --------

| 1       | heige | 123456 |

--------- ------- --------

1 row in set (0.00 sec)

haha~~ 成功注射 修改groudid為1。 這個就是我們的模式2了,簡單的描敘如下:

update-->select-->update

四.實際模式

模式1:discuz 2.0/2.2 register.php 注射

漏洞分析:

discuz 2.0/2.2 register.php remote exploit :

模式2:phpwind 2.0.2和3.31e 許可權提公升漏洞

漏洞分析:

update (profile.php 注射變數為$proicon update語句裡為,icon=$userdb[icon])|v

select (jop.php)|v

updtate (jop.php)

exploit:

五.鳴謝

特別感謝saiy等朋友的討論和幫助。thanks!!!

關於MYSQL into outfile注射

其實網上已經有很多關於mysql注射的文章了 不過還是缺乏重點吧 要使用 into outfile 把 寫到web目錄取得webshell 首先需要 3大先天條件 知道物理路徑 into outfile 物理路徑 這樣才能寫對目錄 能夠使用 union 也就是說需要mysql3以上的版本 對方沒有對...

Bird CMS 注射漏洞

from h4ckx7s blog 在旁註乙個大站的時候,在某個站的後台看見是什麼bird cms管理系統,記得1.1爆了什麼萬能密碼的漏洞!不知道最新版本的有什麼洞子沒有!大致的下了套原始碼看了看,管理和程式設計師都懶了!預設資料庫 datadata bird mdb 漏洞檔案 product.a...

SQL注射總結 5

通常注射的一些介紹 a id 49 這類注入的引數是數字型,sql語句原貌大致如下 select from 表名 where 字段 49 注入的引數為id 49 and 查詢條件 即是生成語句 select from 表名 where 字段 49 and 查詢條件 b class 連續劇 這類注入的...