本文主要是為小菜們服務的,如果你已經是一隻老鳥呢,可能某些東西會感覺比較乏味,但只要你仔細的看,你會發現很多有趣的東西哦。
閱讀此文你只要明白下面的這點東西就夠了。
1.明白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的時候會有什麼情況發生哩,不用驚慌,天是塌不下來的啦!它只是把提交的變數中所有的 ' (單引號), " (雙引號), \ (反斜線) 和 Null 字元會自動轉為含有反斜線的逸出字元,例如把'變成了\',把\變成了\\。
就是這一點,讓我們很不爽哦,很多時候我們對字元型的就只好說BYEBYE了,
但是不用氣餒,我們還是會有好方法來對付它的,往下看咯!
3.有一定的php語言基礎和瞭解一些sql語句,這些都很簡單,我們用到的東西很少,所以充電還來的及哦!
我們先來看看magic_quotes_gpc=Off的時候我們能幹些啥,然後我們再想辦法搞一搞magic_quotes_gpc=On的情況哈
一:magic_quotes_gpc=Off時的注入
ref="http://hackbase.com/hacker" target=_blank>攻擊
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節
下面說一些利用啦
看代碼先
這段代碼是用來搜尋的哦
.........
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