webhacking.解答61番、5番、7番


💡 61題
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
  $db = dbconnect();
  if(!$_GET['id']) $_GET['id']="guest";
  echo "<html><head><title>Challenge 61</title></head><body>";
  echo "<a href=./?view_source=1>view-source</a><hr>";
  $_GET['id'] = addslashes($_GET['id']);
  if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
  if(strlen($_GET['id'])>15) exit("Access Denied");
  $result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
  echo "<b>{$result['id']}</b><br>";
  if($result['id'] == "admin") solve(61);
  echo "</body></html>";
?>
resultのid値がadminの場合、sqlオブジェクトを使用します.クエリ文:select{$GET['id']}from chall 61 order by id desc limit 1
chall 61テーブルでは、id列が降順に並べられており、最初の列のみがインポートされるようです.
fromをフィルタリングするので、「admin」from chall 61--役に立たず、難しすぎます
調べてみると、aliasでコラムを変えることができるコラムの別名がありました.
構文は「select」「文字列」「as(省略可能)コラム名」です.
したがって、selectadmin(as)idと呼ぶことができ、admin別名をidとして使用することを意味する.
最初はURLにエンコードして入れたかったのですが、15文字に制限されていたのでダメで16進数変換が必要でした.
最終的な答えは?id=0 x 61646 D 696 E id(asは文字制限で省略)で、アドレスに入力するとブラウザは自動的に
?id=0 x 61646 D 696 E%20 idを符号化し、問題を解決することができる.
💡 第5題
スクリプトには/memというURLがあり、入ってみると以下のように表示されています.

質問で先に会員入りするのでjoinphpを押すとbyeが出てきました.しかし、アドレスはそのままなので、開発者ツールでソースコードを調べました.
<script>
l='a';ll='b';lll='c';llll='d';lllll='e';llllll='f';lllllll='g';llllllll='h';lllllllll='i';llllllllll='j';lllllllllll='k';llllllllllll='l';lllllllllllll='m';llllllllllllll='n';lllllllllllllll='o';llllllllllllllll='p';lllllllllllllllll='q';llllllllllllllllll='r';lllllllllllllllllll='s';llllllllllllllllllll='t';lllllllllllllllllllll='u';llllllllllllllllllllll='v';lllllllllllllllllllllll='w';llllllllllllllllllllllll='x';lllllllllllllllllllllllll='y';llllllllllllllllllllllllll='z';I='1';II='2';III='3';IIII='4';IIIII='5';IIIIII='6';IIIIIII='7';IIIIIIII='8';IIIIIIIII='9';IIIIIIIIII='0';li='.';ii='<';iii='>';lIllIllIllIllIllIllIllIllIllIl=lllllllllllllll+llllllllllll+llll+llllllllllllllllllllllllll+lllllllllllllll+lllllllllllll+ll+lllllllll+lllll;
lIIIIIIIIIIIIIIIIIIl=llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+lll+lllllllllllllll+lllllllllllllll+lllllllllll+lllllllll+lllll;if(eval(lIIIIIIIIIIIIIIIIIIl).indexOf(lIllIllIllIllIllIllIllIllIllIl)==-1) {alert('bye');throw "stop";}if(eval(llll+lllllllllllllll+lll+lllllllllllllllllllll+lllllllllllll+lllll+llllllllllllll+llllllllllllllllllll+li+'U'+'R'+'L').indexOf(lllllllllllll+lllllllllllllll+llll+lllll+'='+I)==-1){alert('access_denied');throw "stop";}else{document.write('<font size=2 color=white>Join</font><p>');document.write('.<p>.<p>.<p>.<p>.<p>');document.write('<form method=post action='+llllllllll+lllllllllllllll+lllllllll+llllllllllllll+li+llllllllllllllll+llllllll+llllllllllllllll
+'>');document.write('<table border=1><tr><td><font color=gray>id</font></td><td><input type=text name='+lllllllll+llll+' maxlength=20></td></tr>');document.write('<tr><td><font color=gray>pass</font></td><td><input type=text name='+llllllllllllllll+lllllllllllllllllllllll+'></td></tr>');document.write('<tr align=center><td colspan=2><input type=submit></td></tr></form></table>');}
</script>
シナリオは本当に見にくいですドアの中の物をコンソールウィンドウに撮って、解読して整理すると(例えば、lIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIllIll
if(eval(document.cookie).indexOf(oldzombie)==-1) {
    bye;
} // 쿠키에 oldzombie가 없으면 안녕

if(eval(document.URL).indexof(mode=1)==-1){
    alert('access_denied');
    history.go(-1);
} // url에 mode=1이 있어야 함
そこでCookieにOldzombieを追加し、

URLの後ろ?mode=1なら!終了したと思いますが、接続入力ボックスが表示されます.

簡単にidに「admin」(passwordはどうでもいい)と入力すると、IDが既に存在するという警告が表示されます.だからadmin前後にそれぞれ5、10個のスペースを与えて、会員に参加して成功して、このアカウントで登録します.phpアドレスにログインしたら終了です
💡 第7題
<?php
$go=$_GET['val'];
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
$db = dbconnect();
$rand=rand(1,5);
if($rand==1){
  $result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
}
if($rand==2){
  $result=mysqli_query($db,"select lv from chall7 where lv=(($go))") or die("nice try!");
}
if($rand==3){
  $result=mysqli_query($db,"select lv from chall7 where lv=((($go)))") or die("nice try!");
}
if($rand==4){
  $result=mysqli_query($db,"select lv from chall7 where lv=(((($go))))") or die("nice try!");
}
if($rand==5){
  $result=mysqli_query($db,"select lv from chall7 where lv=((((($go)))))") or die("nice try!");
}
$data=mysqli_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]==1){
  echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Access_Denied!')\"><p>");
}
elseif($data[0]==2){
  echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
  solve(7);
}
?>
コードを表示すると、まずget方式で受け取った値をgoに保存します.この値にはpreg matchの文字は含まれません.if文で括弧が1-5からランダムに変化する場合は、まず括弧(20%の確率)を決定してからリフレッシュを続けると、答えになる瞬間があります.
最も重要な最後のelseif記事を見ると,データ値が2の場合にのみ問題が解決されることが分かった.
2、-および+がフィルタされるため、数値操作が困難であり、スペース文字が使用できない可能性があるため、(s)unionを使用してクエリーを作成する必要があります.1-5のうち1を基準に作ると、
select lv from chall7 where lv=($go)
ここで、go値は0)union(select(char(50))を含む.
select lv from chall 7 where lv=(0)union(select(char(50)))).
球体処理された部分をurlに入れて終わり、最初はランダム値で失敗したのですが、リフレッシュを押し続けると成功するので慌てないで!
😎 に感銘を与える
確かに、300点くらいの難易度は高いようで、前に出した問題との差がリアルに感じられるようになりました.500点があなたにとってどれほど難しいか分かりませんが、怖がらないで、怖がらないで、順番に漸進的に解決しなければなりません:)