webhacking.回答52番、53番、55番


💡 52題

guestの名前とパスワードはguestに与えられ,adminページにアクセスすることがこの問題の目的である.まず、入力欄に間違った答えを記入するとlogin failとソースコードが表示されます.
<?php
include "config.php";
if($_GET['view_source']) view_source();
if($_GET['logout'] == 1){
  $_SESSION['login']="";
  exit("<script>location.href='./';</script>");
}
if($_SESSION['login']){
  echo "hi {$_SESSION['login']}<br>";
  if($_SESSION['login'] == "admin"){
    if(preg_match("/^172\.17\.0\./",$_SERVER['REMOTE_ADDR'])) echo $flag;
    else echo "Only access from virtual IP address";
  }
  else echo "You are not admin";
  echo "<br><a href=./?logout=1>[logout]</a>";
  exit;
}
if(!$_SESSION['login']){
  if(preg_match("/logout=1/",$_SERVER['HTTP_REFERER'])){
    header('WWW-Authenticate: Basic realm="Protected Area"');
    header('HTTP/1.0 401 Unauthorized');
  }
  if($_SERVER['PHP_AUTH_USER']){
    $id = $_SERVER['PHP_AUTH_USER'];
    $pw = $_SERVER['PHP_AUTH_PW'];
    $pw = md5($pw);
    $db = dbconnect();
    $query = "select id from member where id='{$id}' and pw='{$pw}'";
    $result = mysqli_fetch_array(mysqli_query($db,$query));
    if($result['id']){
      $_SESSION['login'] = $result['id'];
      exit("<script>location.href='./';</script>");
    }
  }
  if(!$_SESSION['login']){
    header('WWW-Authenticate: Basic realm="Protected Area"');
    header('HTTP/1.0 401 Unauthorized');
    echo "Login Fail";
  }
}
コードでは、$SESSION['login']=admin、$SERVER['REMOTE ADDR']ipアドレスは172.17.0です.何であるべきかを知ることができる.
入力バーに戻り、名前にadmin'#、ロット番号に何を入力してもadminでログインできます.今はipを当てるだけでいいので、Buff Sweetでクロスすれば

こうして出てきたここで授権:基本YWRTAW 4 nIzoxMTExという部分が目立ち、Base 64で復号するとadmin'#:1111と入力欄に書いた値が見えます!
次に、問題提供のエージェントページに入ると、http://webhacking.kr:10008/proxy.php?page=/のようなurlが表示され、adminと後で書きます.
GET/HTTP/1.1でのリクエスト
GET/admin/HTTP/1.1になっていることがわかります.そこで、いくつかの値を入力し、最終的に
GET/admin/HTTP/1.1
Authorization: Basic YWRtaW4nIzoxMTEx
Cookie:PHPSESSID=セッションID
この値段で作らなければなりません.(BuffSweetの価格)
したがって、CookieでセッションIDを検証してください.
admin/%20 HTTP/1.1%0 d%0 aライセンス:%20 Basic%20 YWritaW 4 nLs 0 gLTOxM 0%3 d%0 d%0 d%0 d%0 a Cookie:%20 PHPSESSID=(セッションID)%0 d%0 d%0 atemp:%20
これで入力するとフラグ値が表示されます.この場合、ここでは、多くの%mouchy値が開文字であるか、スペースが符号化されているかのいずれかです.
ソース:https://dailylearn.tistory.com/91
💡 53題
<?php
  include "../../config.php";
  if($_GET['view_source']) view_source();
?>
<html>
<head>
<title>Challenge 53</title>
</head>
<body>
<?php
  $db = dbconnect();
  include "./tablename.php";
  if($_GET['answer'] == $hidden_table) solve(53);
  if(preg_match("/select|by/i",$_GET['val'])) exit("no hack");
  $result = mysqli_fetch_array(mysqli_query($db,"select a from $hidden_table where a={$_GET['val']}"));
  echo($result[0]);
?>
まず$hidden tableテーブル名を見つけなければなりません.
検索すると,プロセス解析()関数を用いて,現在使用されているコラムに関する情報を抽出できることが分かった.URLで?val=1プロシージャ分析()このように入力(valに任意の値が入力されている)すると、次の画面が表示されます.

ここに表示されるcall 53~05は表名でresponse値に入れてurlに送信すれば問題解決!
💡 55題

マウスを動かすと、スコアが変わります.rankを押すと、多くの人のrank、id、scoreが現れ、以下はmysqli query(db、「insert into chall 55値('{SESSION['id']}','.trim(POST['score')])である."','{flag}')"); というクエリがありました.
flagは3番目のフィールドのようで、前の問題で使用したプロシージャ解析()関数でカラム名を検索することを決定します.
/rank.php?score=1 limit 2,1 procedure analyse()
こう書くとp 4 ssw 0 rd 1123581321のコラム名が表示されます.
現在,ブラインドsql injectionのためには,真の偽の結果を区別する必要がある.score=1と1=1を入力すると、Piterpanという文字列が出力され、虚偽の反応を示すと文字列は出力されません.これを利用して、Pythonコードを回します.
https://dailylearn.tistory.com/94このブログのコードを参考にして、ここで初めて右(左)(~~~)を見て、少し整理することにしました.
この問題では、substr関数がフィルタリングされています.これは、ブラインド入力オブジェクトに値を1つずつ代入して検索する際に必要な関数です.その代わりに左右です.
たとえば、right(「文字列」、len)は、文字列の右側からlenの長さに等しい文字列を返します.
従ってsubstr(「pw」,1,1)はright(「pw」,1),1と同様と見なすことができる.
取得したフラグ値を入力すると問題が解決します~
😎 に感銘を与える
今週の問題は確かに難易度が増し、問題を解決する段階は容易ではないと感じられる.自分の最大の力で解決しようと思っていたのですが、まだうまくいかなかったようで本当に悲しくて、うわっ、今回もグーグルの力を借りて、プログラム分析()とright(left)を行いました(~関数について初めて知りました.初めて知ったから悪いというわけではありません.後でこういう問題が発生したときは、これらの関数を思い出して適当に使えばいいだけ!ふふ今週もがんばれ~)