本文主要是为小菜们服务的,如果你已经是一只老鸟呢,可能某些东西会感觉比较乏味,但只要你仔细的看,你会发现很多有趣的东西哦。
阅读此文你只要明白下面的这点东西就够了。
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时的注入
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] ,...]
; ]
これらは一般的に使用されるもので、取得する列を参照します。後で、into outfile を使用して選択結果をファイルに出力することもできます。もちろん、select を使用して直接出力することもできます。たとえば、
select 'a'
+---+
|セット内の 1 行 (0.00 秒)
詳細については、mysql 中国語マニュアルのセクション 7.12 を参照してください
以下にいくつかの使用法を示します
最初にコードを見てください
このコードは検索に使用されます
......
SELECT * FROM users WHERE username LIKE '%$search%' ORDER BY username
....
?>
ここでは、mysql のワイルドカード文字について説明します。「%」はワイルドカード文字、その他のワイルドカード文字です。 「*」と「_」を含めます。「*」はフィールド名と一致するために使用され、「%」はフィールド値と一致するために使用されます。% は like と一緒に適用する必要があることに注意してください。アンダースコア「_」。これは同じ意味です。上記とは異なり、任意の 1 文字と一致するために使用されます。上記のコードでは、「*」を使用して返されるすべてのフィールド名を表し、%$search% は $search 文字を含むすべてのコンテンツを表します。
どうやって注射するのですか?
はは、ASP に非常に似ています
Aabb%' または ID# による 1=1 の形式で送信します
注: # は 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 は戻り値を true のままにし、すべての値を返すことが可能になります
このようなフォームで送信することもできます
%' 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 ' になります。 %%' ID# で注文 ORDER BY ユーザー名
もちろん、すべてのコンテンツが返されます。
すべてのユーザーがリストされ、場合によってはパスワードも表示されます。
最初に例を示します。実際には、Select ステートメントはほぼどこにでも使用されます。
2) 以下のアップデートを見てみましょう。
Mysql の中国語マニュアルでは次のように説明されています。
UPDATE [LOW_PRIORITY] tbl_name SETcol_name1=expr1,col_name2=expr2,...
UPDATE は、既存のテーブルの行の列を更新します。新しい値 SET 句は、変更する列とその列に指定する値を指定します。WHERE 句が指定されている場合は、どの行を更新するかを指定します。それ以外の場合は、すべての行が更新されます。
詳細については、MySQL 中国語マニュアルのセクション 7.17 を参照してください。ここで詳しく紹介すると非常に長くなります。
上記のことから、update は主に記事の変更やユーザーデータの変更などのデータ更新に使用されることがわかります。なぜなら、後者のほうが重要なようです。なぜなら...
まずコードを見てください。テーブルの構造、こうすることで誰もが明確に見ることができます
CREATE TABLE ユーザー (
id int(10) NOT NULL auto