本文主要是為小菜們服務的,如果你已經是一只老鳥呢,可能某些東西會感覺比較乏味,但只要你仔細的看,你會發現很多有趣的東西哦。
閱讀此文你只要明白下面的這點東西就夠了。
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的時候會有什麼情況發生哩,不用驚慌,天是塌不下來的啦!它只是把提交的變量中所有的 ' (單引號), " (雙引號), \ (反斜線) 和 空字符會自動轉為含有反斜線的轉義字符,例如把'變成了\',把\變成了\\。
就是這一點,讓我們很不爽哦,很多時候我們對字符型的就只好說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