[WebSec] Level 25

http://websec.fr/level25/index.php

Information Gathering

Đầu tiên vẫn thử các payloads về SQLi, về XSS, … Tuy nhiên vẫn không có lỗi gì xuất hiện.

View-source challenge thì mình cần chú ý đến 2 đoạn code PHP trong đó.

Source code 1

1
2
3
4
5
6
<?php
if (!isset($_GET['page'])) {
header('Location: http://websec.fr/level25/index.php?page=main');
die();
}
?>

Với đoạn code 1 trên thì check xem trong URL của chúng có tồn tại parameter page không. Nếu không có, thì sẽ Redirect sang trang có page=main (trang chủ của challenge).

Source code 2

1
2
3
4
5
6
7
8
9
<?php
parse_str(parse_url($_SERVER['REQUEST_URI'])['query'], $query);
foreach ($query as $k => $v) {
if (stripos($v, 'flag') !== false)
die('You are not allowed to get the flag, sorry :/');
}

include $_GET['page'] . '.txt';
?>

Với đoạn code 2 ở trên, chúng ta có nhiều vấn đề để phân tích hơn.
Dòng code thứ 2, hàm parse_url() có chức năng phân tích các thành phân của URL ra. Sau đó sẽ gán vào biến $query.

Hàm parse_url() hoạt động như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- $url: "http://example.com/thu-muc/file.php?cmd=ls#rce"
- Sau khi đưa biến vào hàm parse_url() thì hết quả ra sẽ là:

array(5) {
["scheme"]=>
string(4) "http"
["host"]=>
string(11) "example.com"
["path"]=>
string(17) "/thu-muc/file.php"
["query"]=>
string(6) "cmd=ls"
["fragment"]=>
string(3) "rce"
}

- Return của hàm parse_url() là: int|string|array|null|false

Sau khi vào vòng for, nếu như giá trị trong $query lúc này chính kết quả đầu ra của hàm parse_url() mà khác false thì chương trình sẽ die.

Vậy, làm sao để chương trình không die?


Exploit

Để chương trình in ra được flag, thì phải bypass qua vòng for.

Search Google: “parse_url return false in php”

https://stackoverflow.com/questions/47807529/how-to-avoid-php-parse-url-return-false-when-parse-sa-12b-12-3-3-41233-whi

Sau khi tham khảo link trên kết hợp việc debug, thì mình phải cho cái cấu trúc của các param sau khi qua hàm parse_url kết quả bị sai.

Ví dụ:

  • http://example.com///thu-muc/file.php?...
    -> /// sẽ làm cho parse_url() hiểu là host. Nên sẽ bị sai.
  • http://example.com/thu-muc/file.php?cmd=ls&a=1.1.1.1:39
    -> &a có giá trị là host:port, cũng sẽ làm cho parse_url() hiểu sai.

Mục đích của mình lấy flag ở file flag.txt. Vì sau thi include page vào thì chương trình sẽ tự gắn đuôi txt cho mình.

Việc còn lại chỉ lấy flag thôi.

Got the flag


[WebSec] Level 25
https://dovankha.github.io/2022/07/30/lv25/
Author
Khado
Posted on
July 30, 2022
Licensed under