# PicoCTF

\*\* Web Gauntlet 2

type: sqli

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7ahKY8EzQmJFB7ldQ%2Fimage.png?alt=media\&token=ecf89417-79d8-4f0b-8289-8ca582668d21)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7asVyTIc4vARMPQJh%2Fimage.png?alt=media\&token=ce1395de-b63d-4ae6-a332-89a9d5911c0d)

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.

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7bF6sMQtvcAtQcbfU%2Fimage.png?alt=media\&token=e0b127f1-b775-4478-837d-6dcd9cdcbf7f)

`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ư&#x20;

`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.

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

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

password: `,0,0)||'`

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7dlkVbpAmzDdNE9EI%2Fimage.png?alt=media\&token=af59e4a5-4fb4-458f-94de-502b394ace9e)

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.

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7ecroovUUuSATOdb_%2Fimage.png?alt=media\&token=a2c4fd03-6dfc-4cf9-8eea-77087aa8f42e)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7eqgysE2lbRzT_sKV%2Fimage.png?alt=media\&token=b0992b2e-2ede-46da-879e-602859eb9e44)

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='))||''`

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7fx-r1F4fI6n2j9SQ%2Fimage.png?alt=media\&token=8bcc5e70-5efc-4fa2-9bff-a835cdd3f7fa)



\*\* X marks the spot

type: xpath injection

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

{% embed url="https://medium.com/@shatabda/security-xpath-injection-what-how-3162a0d4033b#:~:text=XPath%20injection%20is%20a%20type,construction%20of%20the%20query%20string." %}

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7gVrVZu6yXPaGjtYJ%2Fimage.png?alt=media\&token=e39d8b04-202c-4ffe-88f7-390461563d3c)

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`

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7hY6mdhSBsUbRyJ4Y%2Fimage.png?alt=media\&token=d78579e3-3dc4-4701-81fb-6a723603a767)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7hsVRIipQ67GxnDox%2Fimage.png?alt=media\&token=4017707d-5d89-4e82-a03c-35b8cf909efb)

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&#x20;

đề 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&#x20;

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7jvPr20gAvxP5VFZz%2Fimage.png?alt=media\&token=743f43d5-8699-407b-988d-abeae9afcd2f)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7k6thLcp-upAdiCSL%2Fimage.png?alt=media\&token=d68e89fd-3092-474e-89e1-1684e129c431)

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

ở fikle git-api.ts

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7lK281ctaJHe4SMXG%2Fimage.png?alt=media\&token=478dfc9f-fcf7-4ebd-a633-01c04b977756)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX7aZp_OyvV2GMDSG6e%2F-MX7nH2nU_sJYUxwJl_W%2Fimage.png?alt=media\&token=edbfec4f-8b20-4807-99b0-0e56e55bb451)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MX9xaC73-sw-KMJtDsO%2Fimage.png?alt=media\&token=dc121fdd-9591-451c-b020-c07a55127322)

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

\=> 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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MX9z9iM2LXQwWcpEIAn%2Fimage.png?alt=media\&token=121f718a-b0a2-491b-bbf4-4041e73fa6c9)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MX9zxO956jRI2KOImpH%2Fimage.png?alt=media\&token=ffc2425c-df1f-47c7-b735-a0675c3b1ad9)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA-Gp1_M00bPhvdSST%2Fimage.png?alt=media\&token=3224b5f2-59a0-46a0-99c4-96c9a77a6f65)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA-ssVKF4G_9qSXsvl%2Fimage.png?alt=media\&token=b6ddb63a-87a4-4243-872b-dc5638895bc6)

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

{% embed url="https://stackoverflow.com/questions/2068418/whats-the-difference-between-a-302-and-a-307-redirect" %}

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA4NR6GRx4azpepR1C%2Fimage.png?alt=media\&token=89c470e1-0c8e-4e1f-8af4-7cb941e3a94e)

mở ngrok để tunner connect ra internet

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA4aS23s7h-o51bcsb%2Fimage.png?alt=media\&token=5a54eba5-2b42-4d4e-8305-92f770d92dc2)



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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA4qS5yXLrVc_OY8oy%2Fimage.png?alt=media\&token=5e873a43-e332-402d-9690-29dd477af10e)

push bất kì để trigger web hook



![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA4zi-MNgWyxG8P2a6%2Fimage.png?alt=media\&token=6c426c68-d133-42cb-9c9d-a3cf437a41ca)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MX9xFYEU7yBxBB09ZW7%2F-MXA5AkD-9_IPngeAoDE%2Fimage.png?alt=media\&token=c847ebac-e935-43e3-ad93-fb52f38047b0)







\*\*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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXA9ER9fwCPpr6bStGU%2Fimage.png?alt=media\&token=48e8dc28-2185-439c-9558-ff5e008fcbd8)

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

cookie.php

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXAAf1WzMb58Oy7XGLg%2Fimage.png?alt=media\&token=5f48bf2b-4300-4873-a5cd-12cc10f89d93)

authentication

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXABD4d0XKgDqAWVHrL%2Fimage.png?alt=media\&token=f49a5b0e-d78c-4a41-9216-e51595222919)

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

mà ở trong cookie.php

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXABXVLMjzBa5yQCR2j%2Fimage.png?alt=media\&token=a612fc30-c0ca-478c-bc07-0108a589e24e)

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

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXACXM2pWaw74v5Gq9u%2Fimage.png?alt=media\&token=0b1c5b3c-f124-41f6-ab2b-0c39b9686eb1)

class access\_log có phướng thức tostring để unserialize

final payload

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXADN6bhxZ66G4zQVNe%2Fimage.png?alt=media\&token=5114210e-26f3-4fe5-8172-152a3f578a5f)

![](https://4037146917-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMdqbAeoFMfWVhfYubS%2F-MXA6EuRtblTreAmFRUm%2F-MXADK0U0sSIQqXgsIl8%2Fimage.png?alt=media\&token=aefeed31-6c2a-4e17-95af-70b41a723195)
