文/安全天使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 連續劇 這類注入的...