
Turkish: 
Geçen gün twitter gördüm bu resim
bazı php kodlarının
orada ölümcül böcek. Çok kısa
Nasıl yapacağımı açıklamak için kullanabileceğimi düşündüm.
bir şeye yaklaşın ve dayanılmaz bir şekilde söyleyin
ayrıntı boyunca ne düşündüğümü düşünüyorum.
Bunu çözmek için son şansın
kendin, introdan sonra biz içeri giriyoruz.
Php, genellikle bir web sunucusu işleme üzerinde çalışıyor
HTTP istekleri. Bu yüzden değişken olduğunu biliyorum
$ _POST bir POST'ta gönderilen değişkenleri içerir
istek. Ve böylece benim frist kaba tarama bitti
kod aklımda. Bu girdi
kontrol edebiliriz.
Yani gelen bazı girdiler var ve
boş olmasak aksi halde hata alırız.
O zaman bir çeşit gizli ortama sahibiz.
değişken. Bundan sonra başka bir giriş olup olmadığını kontrol ederiz.

English: 
The other day I saw on twitter this picture
of some php code and it’s asking about a
deadly bug in there. It’s so short that
I thought I could use it to explain how I
approach something and tell you in excruciating
detail what I’m thinking along the way.
So last chance for you to figure it out on
your own, after the intro we head right in.
Php is generally running on a webserver handling
HTTP requests. So I know that the variable
$_POST contains variables submitted in a POST
request. And so on my frist rough scan over
the code I have that in mind. That is input
we can control.
So there is some input coming in and it has
to be not empty, otherwise we get an error.
Then we have some kind of secret environemnt
variable. After that we check if another input

Turkish: 
ayarlanır ve bu durumda isteğe bağlıysa
sha256 ile hmac yürütülür.
Aşağıdaki ikinci hamac her zaman gerçekleşecek.
Sonra hmac sonucunu bir başkasıyla karşılaştırırız
kullanıcı tarafından sağlanan değer
Bu `exec` işlevi, muhtemelen anlamına gelir
kod yürütme. Yani bu bir hack mücadelesi olduğu için
ölümcül bir böcek bulmak için, biz açıkça
her nasılsa kullanıcı tarafından kontrol edilen kod almak zorunda
bu POST değişkenli ana bilgisayar. Gayet açık.
Böylece taramaya başladım.
Kod yukarıdan aşağıya doğru Kod okuma
Yapıldığı gibi, ama yine de sadece kaymağını
Hangi kullanıcıya gerçekten dikkat etmedim
girdi değişkenleri var ve bunları etkileyenler
var. Hala tam olarak ne rol olduğunu bilmiyorum
hmac var. Ve bu yüzden hala çok bulanık
resim.
Ancak belli ki biraz tecrübem var ve
bu yüzden yakından bakmadım, biliyorum
kabaca hmac'dan ne beklenir. hmac
basit bir algoritma veya işlem sırasıdır

English: 
is set, and if that was the case this optional
hmac with sha256 is executed.
The second hamac below will happen everytime.
Then we compare the hmac result with another
user supplied value and if it matches we reach
this `exec` function, that probably means
code execution. So as this is a hacking challenge
to find a deadly bug, it’s clear that we
somehow have to get user controlled code in
this POST variable host. Pretty obvious.
So I started looking at this, by scanning
the code from top to bottom. Reading code
like it was executed, but still just skimming,
I didn’t really pay attention to which user
input variables exist and what affects they
have. I still don’t know exactly what role
the hmac has. And so it’s still a very blurry
picture.
However I obviously have some experience and
so eventhough I didn’t look closely, I know
roughly what to expect with the hmac. hmac
is a simple algorithm, or sequence of operations

English: 
you do with a hash function, in this case
sha256, that is used to authenticate messages
or data. It’s like a fancier hash. But with
a secret. And so the secret affects the output
of the hmac and only somebody who knows the
secret, can generate the same output. So I
know that hmac is cryptographically very strong,
and that without knowing the secret, you can’t
do anything. So I don’t really have to research
hmac and how it works and if there are cryptographic
weaknesses. It’s simple and strong. So I
have that in the back of my mind.
But now, that I found the goal that I want
to reach, a part that we could exploit, I
want to trace the code backwards. I want to
figure out the conditions that lead to this
being exploitable.
So I make a mental note that the host variable
could lead to code execution.
Before that we find an if check, that has
to succeed, otherwise we exit and never reach
the exploitable part. And so here is another

Turkish: 
Bu durumda bir karma fonksiyonu ile yapmak
sha256, mesajların kimliğini doğrulamak için kullanılır
veya veri. Bir meraklı hash gibi. Fakat
bir sır. Ve böylece sır çıktıyı etkiler.
hmac ve sadece bilen biri
gizli, aynı çıktıyı üretebilir. Yani ben
hmac’ın kriptografik olarak çok güçlü olduğunu biliyorum.
ve sırrını bilmeden, yapamazsın
birşeyler yap. Bu yüzden gerçekten araştırma yapmak zorunda değilim
hmac ve nasıl çalıştığını ve kriptografik olup olmadığını
zayıflıklar. Çok basit ve güçlü. Yani ben
aklımın arkasında bunu var.
Ama şimdi istediğim hedefi buldum
Ulaşabileceğimiz bir bölüme ulaşmak için
kodu geriye doğru izlemek istiyorum. İstiyorum
Buna yol açan koşulları çözmek
sömürülebilir olmak.
Bu yüzden ev sahibi değişken olduğunu zihinsel bir not yapmak
kod yürütmesine neden olabilir.
Ondan önce eğer bir if çek bulduk,
başarılı olmak için, aksi halde çıkıp asla ulaşamayız.
sömürülebilir kısım. Ve böylece burada başka

Turkish: 
hmac adı verilen kullanıcı kontrollü değişken.
Ama bir php değişkeni hmac ile karşılaştırıldı
Daha önce satırda üretildi. Onun
hash_hmac fonksiyonunun çıktısı. Yani biz
Bu hmac fonksiyonunun çıktısını bilmek zorunda
Böylece aynı değeri
Hmac POST değişkeni ve bu kontrolü geç.
Ama bu php tek yolu değil nasıl bazı
çekler başarısız olabilir. Nedense beynim
o anda görmezden geldi! ya da sadece istedim
farklı bir gerçeklik görmek için aptal beyinler
çok güvenilmez, bir saniye için bunu düşündüm
güvensiz bir php karşılaştırmasıdır.
Peki bunun anlamı nedir? Php türü hokkabazlık vardır,
bu, “bir değişkenin türü belirlenir” anlamına gelir
Değişkenin kullanıldığı bağlamda. ”.
Ve böylece örneğin bu iki farklı dizeleri
doğru olarak değerlendir. Çünkü içeriğe dayalı
otomatik olarak sayılara dönüştürülür,
ve bu ikisi de 0'dır. Ve ne olabilir?

English: 
user controlled variable called hmac.
But it’s compared to a php variable hmac
that was generated in the line before. It’s
the output of the hash_hmac function. So we
have to know the output of this hmac function,
so that we can supply the same value via the
hmac POST variable and pass this check.
But that’s not the only way in php how some
checks could fail. For some reason my brain
in that moment ignored the ! or just wanted
to see a different reality, stupid brains,
so unreliable, for a second I thought this
is an insecure php comparison.
So what does that mean? Php has type juggling,
which means that “a variable's type is determined
by the context in which the variable is used.”.
And so for example these two different strings
evaluate to true. Because based on the context
they are automatically converted to numbers,
and so those are both 0. And what can happen

English: 
now is, that if for some reasons, two different
hash strings start with 0e, followed by only
numbers, they would evaluate to true. This
is a very typical CTF php challenge. So I
thought maybe, we have here a similar issue,
because == in php means equal after type juggling,
while === means identical, and the type has
to match too. So I guess my brain saw two
== signs and thoguht of type juggling. But
of course the secure string comparison for
not identical is in fact !==. The insecure
variant would be !=.
So I had this in mind and was exploring this
wrong lead for a little bit.
I was wondering, is this type juggling really
feasible here? With sha256 hmac hashes? Our
input here can easily have the correct format
of 0e-something, but to get 256bit hmac to

Turkish: 
Şimdi, bazı nedenlerden dolayı iki farklı
karma dizeleri 0e ile başlar, ardından
sayıları doğru olarak değerlendirirlerdi. Bu
çok tipik bir CTF php mücadelesidir. Yani ben
belki de burada benzer bir meselemiz olduğunu düşündüm,
çünkü == php cinsinden hokkabazlıktan sonra eşit demektir.
===, aynı anlamına gelir ve
de eşleşmek için. Sanırım beynim iki tane gördü
== tür hokkabazlık işaretleri ve thoguht. Fakat
Tabii ki güvenli dize karşılaştırma
özdeş değil aslında! ==. Güvensiz
değişken olacaktır! =.
Yani bunu aklımdaydı ve araştırıyordum.
biraz yanlış yol açar.
Merak ediyordum, bu tür gerçekten hokkabazlık mı
Burada uygulanabilir mi? Sha256 hmac hash ile? bizim
buraya giriş kolayca doğru formatta olabilir
0e-şey, ancak 256bit hmac almak için

Turkish: 
bilmeden aynı sonucu al
Gizli, sunucuyu kırmak zorunda kalacağız
İşte. Ve bu çok düşük bir ihtimal gibi görünüyor. Böyle olan
genelde kaba kuvvet kullanmaya çalıştığınız saldırılar için
Örnek bulana kadar yerel olarak md5 hash'leri
böyle bir desen. Sadece doğru gelmiyordu.
Bu meydan okuma “ölümcül bir böcek” anlamına geliyor
ve bu her zaman bağlı olarak farklı olurdu
kullanılan sırda. O kadar ölümcül değil.
Ve böylece bunu düşünürken de ben de
bir nokta fark edildi, ayy. Bu aslında
güvenli bir karşılaştırma.
Ama sorun değil, bu normal.
girerken yanlış yönleri yanlış yönlendirir
fikirler. Ve hack yaratıcı bir kontrol listesi değil
Bir şey, beklemek için öyle.
Tamam… öyleyse şimdi karşılaştırmanın güvenli olduğunu biliyoruz.
Bu, bir şekilde tahmin etmemiz gerektiği anlamına gelir.
hmac sonucu, aynı şeyi sağlayabilmemiz için
hmac POST değişkeninden gelen girdiyle değer.
Sooo… bu hmac değeri, nasıl üretiliyor?
Ana bilgisayar üzerinde sha256 ile bir hmac yapar

English: 
have the same result, without knowing the
secret, we would have to bruteforce the server
here. And that seems very unlikely. With such
attacks you generally try to bruteforce, for
example md5 hashes locally, until you find
such a pattern. It just didn’t feel right.
The challenge calls for a “deadly bug”,
and this would always be different depending
on the used secret. It’s not that deadly.
And so while thinking about that I also at
some point realized, oops. This is actually
a secure comparison.
But that’s ok, that is sooooo normal that
you steer intro wrong directions when having
ideas. And hacking is creative and not a checklist
kind of thing, so thats to expect.
Ok… so now we know that comparison is secure.
Which means we have to somehow predict the
hmac result, so that we can supply the same
value with our input from the hmac POST variable.
Sooo… that hmac value, how is it generated?
It does a the hmac with sha256 over the host

Turkish: 
giriş değişkeni, istediğimiz kod bu
yürütmek ve sırrı için $ secret kullanır.
Ve sır olarak iki kaynak var. Bir
SECRET ortam değişkenidir. Yani bu
bilmediğimiz bir değer. Bruteforce deneyebiliriz
ya da tahmin et, belki boş bırakılmıştır. Fakat
bu canlı bir sunucu veya meydan okuma değil, biz
bunu test edemiyorum. Sırrı almalıyız.
aslında gizlidir ve kaba değildir.
Bu ölümcül bir böcek, kaba kuvvet veya tahmin
bunun bir parçası olmaz ve
sadece burada gösterilen bu kodla çözülebilir.
Ancak sır için diğer sicili çıktı
Diğer hmac çağrısı. Ve bu çağrı yapıldı
girdi ile kontrol ettiğimiz yokluğun üzerinde.
Ama bu daha sonra kesinlikle sırrı kullanır
biz bilmiyoruz.
Mh… Demek ki içimiz olmadan, bilmiyoruz
Sır, bu, üretemeyeceğimiz anlamına gelir.
yerel olarak aynı hmac çıktısını alıp iletmek
bu kontrolde başarılı olmak için,

English: 
input variable, so that’s the code we want
to execute and it uses $secret for the secret.
And there are two sources for secret. One
is the environment variable SECRET. So that’s
a value we don’t know. We could try to bruteforce
or guess it, maybe it was left empty. But
this is not a live server or challenge, we
can’t test that. We have to assume the secret
is actually secret and not bruteforceable.
It’s a deadly bug, bruteforce or guessing
would not be part of it, and it should be
solvable just by this code shown here.
But the other souce for secret is the output
of the other hmac call. And that call is done
over the nonce that we control with the input.
But that one then uses definitely the secret
we don’t know.
Mh… So without the nonce, we don’t know
the secret, which means we can’t generate
the same hmac output locally and pass it in
to succeed in this check,

English: 
And also if we use a nonce, we generate a
new secret, but that output is also not predictable
because we don’t know the secret for this
function.
Actually the code doesn’t look too bad.
It’s harder than I thought it would be.
So now I start to get a bit frustrated. I
thought I look at it and figure it out immediately.
Especially because the code feels fishy, the
part with the nonce is weird. I’ve read
a lot of source code over the years, and I
believe I have generally a good understanding
and intuition on how, for example hmac, can
be used and what kind of problems it solves.
And also generally software design and architecture.
And this construct here doesn’t resemble
anything, it’s weird. So It was obviously
specifically crafted for a challenge.
But still, I’m not sure what I’m getting
at here.
Mhmmh…
So now I’m going through my php checklists
in my head. Stuff I learned from experience
and over the years. We got the insecure php
type juggling, for example for comparisons,
but that one is safe.
We have dangerous functions like exec, but
that one is our goal and we can’t reach

Turkish: 
Ve ayrıca, bir nonce kullanıyorsak,
yeni sır, ancak bu çıktı da öngörülebilir değildir
çünkü bunun sırrını bilmiyoruz.
işlevi.
Aslında kod çok da kötü görünmüyor.
Düşündüğümden daha zor.
Şimdi biraz sinirli olmaya başladım. ben
Şuna bakıp hemen çözeceğim sandım.
Özellikle de kod balık gibi göründüğü için
sigara ile parçası garip. okudum
yıllar boyunca çok fazla kaynak kodu ve ben
genel olarak iyi bir anlayışa sahip olduğuma inanıyorum
ve örneğin hmac'ın nasıl yapabileceği hakkında sezgi
kullanılmalı ve ne tür problemler çözülmeli.
Ve ayrıca genel olarak yazılım tasarımı ve mimarisi.
Ve bu yapı burada benzemiyor
bir şey, bu garip. Yani belli ki
Bir meydan okuma için özel olarak hazırlanmış.
Ama yine de, ne aldığımdan emin değilim.
burada.
Mhmmh ...
Şimdi php kontrol listemden geçiyorum
kafamın içinde. Deneyimden öğrendiğim şeyler
ve yıllar boyunca. Güvensiz php aldık
örneğin karşılaştırmalar için hokkabazlık yazın
ama bu güvenli.
Exec gibi tehlikeli fonksiyonlarımız var ama
bu bizim hedefimiz ve ulaşamıyoruz

English: 
it with arbitrary input right now. The other
functions I think are safe(?). Sometimes php
can be surprising about which functions are
dangerous, but these I think are all good.
I will not check them all now, that would
be a very desperate measure.
I know that for example CGI scripts get the
input data from actual server that receives
the HTTP request, as environment variables.
So I’m wondering if there is maybe a way
how we could actually set the SECRET variable
from an HTTP request. But not in this way,
generally the web server would prepend any
arbitrary variables with for example HTTP_.
Otherwise that could be a very bad vulnerability
in itself. Maybe you could LD_PRELOAD something.
So that was just another dumb brain fart.
The only last thing I can think of has to
do with inputs. You see not every user input
coming in has to be a string. I know that
because when I was very young, in my teenage
years I used to program a lot of php. So from

Turkish: 
şu anda keyfi bir girdiyle. Diğer
Fonksiyonlar güvenli olduğunu düşünüyorum (?). Bazen php
hangi fonksiyonların olduğu konusunda şaşırtıcı olabilir
tehlikeli, fakat bunların hepsi iyi.
Hepsini şimdi kontrol etmeyeceğim, bu
çok çaresiz bir ölçü ol.
Örneğin, CGI betiklerini aldığımı biliyorum.
alan gerçek sunucudan veri girişi
ortam değişkenleri olarak HTTP isteği.
Bu yüzden belki bir yolu olup olmadığını merak ediyorum
SECRET değişkenini gerçekte nasıl ayarlayabiliriz
Bir HTTP isteğinden. Ama bu şekilde değil,
genellikle web sunucusu herhangi bir
örneğin HTTP_ ile isteğe bağlı değişkenler.
Aksi takdirde bu çok kötü bir güvenlik açığı olabilir
kendi içinde. Belki bir şey LD_PRELOAD olabilir.
Yani bu sadece başka bir aptal beyin osuruk oldu.
Aklıma gelen en son şey
girişleri yapın. Her kullanıcı girişini görmüyorsunuz
içeri giren bir dize olmalı. bunu biliyorum
çünkü çok gençken gençliğimde
Yıllar boyunca çok fazla php programlamıştım. Yani

English: 
my programming experience I know that you
can also pass for example arrays via POST
or GET variables. You do this by adding brackets
[] after a variable name. And then you can
have multiple of them and they will be combined
into an array.
So in php, as an attacker, you can not only
just control the value of the input, but also
the type.
That’s very clearly the last resort right
now, if it’s not that then I really have
no clue what’s wrong.
I know our main target is the hmac here, it’s
the check, the authentication of the message,
the part that is preventing us from reaching
the exec. So of course that is the first thing
I want to check. How is the hmac function
behaving if the user input here would be an
array.
To do that I just use php. With php -a you
can get an interactive php shell.
So… let’s see. hash_hmac. We use sha256,

Turkish: 
programlama deneyimim seni biliyorum
POST ile örneğin dizileri de geçebilir
veya GET değişkenleri. Bunu parantez ekleyerek yaparsınız
[] değişken bir addan sonra. Ve sonra yapabilirsin
bunlardan birkaçı var ve birleştirilecekler
bir diziye
Yani php, bir saldırgan olarak, sadece
sadece girişin değerini kontrol edin
türü
Bu kesinlikle son çare değil
şimdi, eğer o değilse
Neyin yanlış olduğu hakkında hiçbir ipucu yok.
Ana hedefimizin burada hmac olduğunu biliyorum.
kontrol, mesajın doğrulanması,
ulaşmamızı engelleyen kısım
exec. Tabii ki bu ilk şey.
Kontrol etmek istiyorum. Hmac işlevi nasıl
Buradaki kullanıcı girişi bir
dizi.
Bunu yapmak için sadece php kullanıyorum. Php ile -a sen
Etkileşimli bir php kabuk alabilirsiniz.
Öyleyse görelim. hash_hmac. Sha256 kullanıyoruz

Turkish: 
ve sonra bizim olacak bir dize girdik
girdi, ardından biraz sır. Ve yapma
sonunda noktalı virgül unut. Oh ve sen
işlevin dönüşünü yankı yapmak istiyorum. Yani
burada hmac çıktısını alıyoruz. İnce. Yapabilirsin
Ayrıca yankı yerine var_dump kullanın, çünkü
Bu da size iade edilen türünü verir
değer.
Öyleyse şimdi bizim girişimiz olursa ne olacağını görelim.
bunun yerine bir diziydi.
Bir uyarı alıyoruz: hash_hmac () parametre bekliyor
2 dize olmak, ancak bir dizi verildi
1. satırda php kabuk kodu.
AMA burada en önemli kısım, bu
Sadece bir uyarı. Ve burada döndüğünü görebilirsiniz
değer NULL idi.
Bunu gördüğümde hash_hmac sadece bir uyarı veriyor
yanlış parametre türünde ve ölmeyen
korkunç bir istisna dışında bunu biliyordum
kötüdür. Bu hile olmalı. Ne tür
kodumuzda etkisi var mı?
Hmac'ımız için $ sırrını kontrol edebiliriz.

English: 
and then we enter a string that would be our
input, followed by some secret. And don’t
forget the semicolon at the end. Oh and you
want to echo the return of the function. So
here we get the hmac output. Fine. You can
also use var_dump instead of echo, because
that gives you also the type of the returned
value.
So now let’s see what happens if our input
was an array instead.
We get a warning: hash_hmac() expects parameter
2 to be string, but an array was given in
php shell code on line 1.
BUT the crucial part here is, that it’s
just a warning. And you can see here the returned
value was NULL.
When I saw that hash_hmac only throws a warning
with a wrong parameter type, and not dying
horribly with an exception, I knew that this
is bad. This must be the trick. So what kind
effect does that have on our code?
We can control the $secret for our hmac on

English: 
the host, via the hmac of the nonce. And we
can control the nonce. So if we would pass
in an array as nonce, then this hmac would
return NULL. So let’s see how hash_hmac
behaves, when the $secret is now NULL for
the second hmac.
Nothing, no warning. Null is a perfectly fine
secret apparently. Which means we can now
fully predict, or calculate, the correct hmac
for any input we want. The secret will be
NULL here.
So now it’s easy, we just have to choose
the string that we want to enter into exec,
for example “;id”. semicolon, to end the
host command, followed by the id command to
print the current user. So that will be the
value for host.
And then we generate the hmac for that, with
the secret NULL.
And then we just have to make sure that nonce
is an array.
And here we have the full HTTP post request
body. Done.
One other thing, when writing down what I
thought, I had one other idea that I maybe

Turkish: 
ana bilgisayar, nonce hmac'ı aracılığıyla. Ve biz
olmayanı kontrol edebilir. Yani geçersek
bir dizi olmayan bir dizide, o zaman bu hmac
NULL döndür. Öyleyse bakalım nasıl hash_hmac
$ sırrı şimdi NULL olduğunda, davranır
ikinci hmac.
Hiçbir şey, uyarı yok. Boş mükemmel bir para cezası
görünüşe göre gizli. Yani şimdi yapabiliriz
tam hmacını doğru tahmin et veya hesapla
İstediğimiz herhangi bir giriş için. Sır olacak
NULL burada.
Yani şimdi kolay, sadece seçmek zorundayız
exec içine girmek istediğimiz dizge,
örneğin “; id”. noktalı virgül
host komutu, ardından id komutu
geçerli kullanıcıyı yazdır. Yani bu olacak
ana bilgisayar için değer.
Ve sonra bunun için hmac'ı üretiyoruz.
sır NULL.
Ve sonra sadece bu dengesizliği sağlamak zorundayız.
bir dizi.
Ve burada tam HTTP gönderi isteğine sahibiz
vücut. Bitti.
Başka bir şey, ne yazdığımı yazarken
düşündüm, belki bir başka fikrim var

English: 
should keep in mind for the next challenge.
Very rarely, but sometimes, developers screw
up the order of parameters of a function.
And so I should have checked which parameters
hash_hmac actually takes - because maybe the
real secret could have been the first parameters,
and then the secret would have been always
“sha256”. Of course that is not the case
here, but that was not an idea or thought
I had when originally approaching this challenge
and so I should probably keep that as a possibility
in mind.
Anyway, I hoped you liked this deep dive into
my brain.

Turkish: 
Bir sonraki meydan okuma için akılda tutulması gerekir.
Çok nadiren, ancak bazen, geliştiriciler vida
Bir fonksiyonun parametrelerinin sırasını yükseltir.
Ve böylece hangi parametreleri kontrol etmeliydim
hash_hmac aslında alır - çünkü belki
gerçek sır ilk parametreler olabilirdi
ve sonra sır her zaman olurdu
“Sha256”. Tabii ki böyle değil
burada, ama bu bir fikir ya da düşünce değildi
Başlangıçta bu zorluğa yaklaşırken yaşadım
ve bu yüzden muhtemelen bunu bir olasılık olarak tutmalıyım
akılda.
Her neyse, umarım bu derin dalışı seversin
Beynim.
