PicoCTF

** Web Gauntlet 2

type: sqli

vào link chall thì ta thấy như sau, có thể đoán được mình phải bypass login ở đây.

nhìn vào filter thì thấy như sau

có 2 cách có thể cmt trong sqllite là /**/ và -- đều đã bị cho vào black list, nhìn vào filter này thì có vẻ nohope, mình thử login như một user bình thường thì thấy được query như sau.

SELECT username, password FROM users WHERE username='a' AND password='â'

ở trường hợp bình thường thì mình có thể tạo chuỗi admin đồng thời cmt đống phía sau thì có thể bypass được login, nhưng ở đây đã bị filter hết các cách cmt trong sqlite.

mình nghĩ tới hướng ném tất cả những thứ dư thừa vào trong một hàm thì có thể thay thế cmt luôn.

kiểu đại loại như

SELECT username, password FROM users WHERE username='admin'||substr(' AND password=',0,0)||''

trong sqlite toán tử || dùng để nối chuỗi, như trường hợp trên ta đã loại bỏ được phần AND password= mà không cần dùng tới cmt.

nhưng admin thì có trong black list nên ta sẽ tiếp tục sử dụng nối chuỗi ở đây.

vậy payload cuối cùng của bài như sau:

username: admi'||'n'||substr(

password: ,0,0)||'

check filter.php thì sẽ có flag + source code.

** Web Gauntlet 3

cũng tương tự như chall trước nhưng bây giờ bị limit ký tự ngắn hơn: len(username+pass)<25 nên việc sử dụng substr là không khả thi, mình chuyển sang doc của sqlitte để tìm kiếm một hàm thích hợp.

có vẻ hàm này là thích hợp nhất, mình thử test local với hàm này như sau

tức là nó sẽ trả về đối số đầu tiên không phải null.

vậy payload cuối của mình như sau.

username:admi'||(nullif('n',

password: ))||'

query trong db: SELECT username, password FROM users WHERE username='admi'||(nullif('n',' AND password='))||''

** X marks the spot

type: xpath injection

với hint được cho là xpath, mình search gg về bug này

thử với payload injection bình thường để bypass login thì thấy

chỉ có dòng màu xanh hiện ra -> bypass login không phải vấn đề

vậy chỉ còn lại extract password.

mình tiếp tục search blind xpath injetion.

sau khi đọc khá nhiều blog về dạng này mình nhận thấy chắc chắn phải biết cấu trúc của xml bên trong mới thực hiện query blind được, nhưng thử các cách thì đều không thể tìm được cấu trúc của xml nên mình chuyển hướng.

search gg: xpath search the entire document for a string

sử dụng //* để tìm kiếm flag trong toàn bộ document.

xác nhận blind thành công, tới đây có thể viết script để brute phần còn lại của flag.

** bitHug

type: ssrf

đề cung câp source nên ta sẽ đọc qua một lượt để tìm chỗ có thể focus vào

ở đây mình focus vào các file api, server được viết bằng type script

đầu tiên ở file auth-api.ts

nếu request được gửi từ local thì user đó sẽ được auto xác nhận là admin

đồng thời flag nằm ở repo của admin => ssrf.

ở fikle git-api.ts

tạo một web hook với điều kiện không được point to local

thực hiện push git bất kỳ sẽ trigger webhook, đây là chỗ mà ta sẽ ssrf. vì app sử dụng fetch để request tới webhook nên ta có thể sử dụng redirect ở đây -> có thể bypass được điều kiện ở add webhook

thực hiện đăng nhập và tạo mới repo với file README.md

ở table user ta thấy

đây là cách để add một user bất kỳ vào repo của mình

=> goal là ssrf add mình vào repo của admin

  • exploit:

clone reop của mình về

thực hiện add user như hướng dẫn. ở lệnh push cuối cùng, đồng thời bật wireshark để bắt request

ta thấy đây là post request để add user vào repo

copy payload và encode base64 như sau

copy gói tin ở dạng escape string

payload bắt đầu từ \x30\x30

ở chức năng tạo web hook

post request ta thấy mình có thể control bao gồm, url,payload ở dạng base64, và content type.

ở redirect status có 2 dạng chính là 302 và 307

302 chỉ chuyển hướng tới target với get request, còn 307 thì chuyển đồng thời cả method và data nếu có.

vậy ta tạo một file thực hiện 307 redirect như sau

mở ngrok để tunner connect ra internet

body là bs64 đã gen trước đó, content type giống với lúc push git

push bất kì để trigger web hook

ta thấy có request tới và được redirect ngay

xác nhận add user thành công bằng cách access /_/n3mo

**Super Serial

request tới robots.txt ta thấy 1 endpoint mới là admin.phps

nhưng request tới endpoint đó thì thấy 404

thử access vào index.phps

follow theo thì ta sẽ lấy đủ source

cookie.php

authentication

đọc code ta thấy, file này require cookie.php

mà ở trong cookie.php

unserialize bất kỳ cookie login nào nếu được set

class access_log có phướng thức tostring để unserialize

final payload

Last updated