iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1
Security

我搶到旗子了!30天CTF入門系列 第 9

Day09 [Web] SQLinjection 填字遊戲

今天就進入到Web的2顆星的題目了,其實2顆星的題目只是沒有那麼直覺,在做的時候多想一下或是有什麼工具可以實現唷~


點進去出現了一個影片其他什麼也沒有,依上面的訊息來看應該是在第二個按鈕出了錯誤

提示說這兩個按鈕有什麼不同,就直接開F12看程式碼,第一個按鈕是以POST的方式發出請求的,但第二個沒有說他是POST,點開Network的欄位點進第二個按鈕,發現他是利用GET的方式

這時我們可以利用工具將請求重新以POST的方式,不過這邊我採用Linux指令的方式
curl這個指令他可以利用HTTP的方式存取網路上的資源

curl -X 後面可以接要發出的請「(GET/POST/...等等) 要發出請求的網址

$ curl -X POST http://2018shell.picoctf.com:21579/button2.php
Well done, your flag is: picoCTF{button_button_whose_got_the_button_ed306c10}

這邊就可以以POST的方式向網站發出請求囉~


又是一題要我們登入的題目,不過他這邊提供了php source code我們就來看看吧

<?php
  ini_set('error_reporting', E_ALL);
  ini_set('display_errors', 'On');

  include "config.php";
  $con = new SQLite3($database_file);

  $username = $_POST["username"];
  $password = $_POST["password"];
  $debug = $_POST["debug"];
  $query = "SELECT 1 FROM users WHERE name='$username' AND password='$password'";

  if (intval($debug)) {
    echo "<pre>";
    echo "username: ", htmlspecialchars($username), "\n";
    echo "password: ", htmlspecialchars($password), "\n";
    echo "SQL query: ", htmlspecialchars($query), "\n";
    echo "</pre>";
  }

  //validation check
  $pattern ="/.*['\"].*OR.*/i";
  $user_match = preg_match($pattern, $username);
  $password_match = preg_match($pattern, $username);
  if($user_match + $password_match > 0)  {
    echo "<h1>SQLi detected.</h1>";
  }
  else {
    $result = $con->query($query);
    $row = $result->fetchArray();
    
    if ($row) {
      echo "<h1>Logged in!</h1>";
      echo "<p>Your flag is: $FLAG</p>";
    } else {
      echo "<h1>Login failed.</h1>";
    }
  }
  
?>

有沒有注意到23.24行,他比對的內容只有針對username並沒有針對password的部份,所以我們可以對密碼欄位進行SQLinjection,不過以往我們利用註解繞過後面判斷密碼的方式進行,但是這時要對密碼進行injection要知道帳號是多少,但是這邊看起來沒有什麼頭緒

不過突然想到可以利用SQL語法中的AND,讓後面變成True就可以拿到FLag了
SELECT 1 FROM users WHERE name='$username' AND password='$password'
我們隨便輸入帳號,密碼我們可以輸入' or 1=1 --就可以成功拿到Flag囉

這邊也有另一個方法
在user的欄位輸入:'/*
密碼的欄位輸入:*/ or 1=1 --
Query的語句會變成 SELECT 1 FROM users WHERE name=''/*' AND password='*/ or 1=1 --'
這裡可以看到判斷密碼已經被我們註解掉,就可以順利取得Flag囉~


對php不熟一開始看還有點吃力,不過還好這題的漏洞算是蠻直覺的,不過沒有仔細看還真沒看出來呢,原來打CTF細心也是非常重要的啊!


上一篇
Day08 [Web]原來機器人可以保護我不被google找到
下一篇
Day10 [Web] 天然純手工HTTP request
系列文
我搶到旗子了!30天CTF入門30

尚未有邦友留言

立即登入留言