본문 바로가기

Security

[Webhacking] server side request forgery (SSRF)

반응형

웹 어플리케이션에서 사용자가 입력한 URL에 요청을 보내는 기능이 구현되어야 하는 경우도 존재.

URL을 통해 사용자가 입력한 사진을 업로드하는 기능을 구현하면 사용자가 입력한 URL을 웹 어플리케이션에서 접근해야 함.

CSRF와 차이점은 변조된 요청을 보내는 대상의 차이.

CSRF는 변조된 요청을 웹 클라이언트(브라우저)가 보내며, SSRF는 웹 어플리케이션에서 보냄.

웹 어플리케이션에서 요청을 보내기 때문에 웹 어플리케이션이 작동하고 있는 포트, 서버와 연결된 내부망에 요청 보낼 수 있음


External

from flask import Flask, render_template, request
import requests
from dreambank import imgcheckFunc, adminFunc, configFunc, logFunc
app = Flask(__name__)
adminIP = ["127.0.0.1"]
def adminCheck():
	if request.remote_addr in adminIP:
		return True
	else:
		return False
@app.route("/")
def index():
	if adminCheck():
		return render_template("admin_index.html")
	else:
	    return render_template("index.html")
@app.route("/imgCheck")
def imgcheck():
	url = request.form['url']
	img = requests.get(url).content
    checkResult = imgcheckFunc(img)
    return checkResult
@app.route("/admin")
def admin():
	if adminCheck():
		return adminFunc()
@app.route("/config")
def config():
	if adminCheck():
		return configFunc()
@app.route("/log")
def log():
	if adminCheck():
		return logFunc()
if __name__ == "__main__":
    app.run(host='0.0.0.0')

 

Internal

from flask import Flask, render_template, request
import requests
from dreambank import userLevel, userList
app = Flask(__name__)
@app.route("/")
def index():
	return render_template("index.html")
@app.route("/user")
def user():
	action = request.args.get('action')
	if action == "grant":
		name = request.args.get('name')
		result = userLevel(name, 'admin')
	elif action == "list":
		result = userList()
	else:
		result = userList()
    return result
if __name__ == "__main__":
    app.run()

 

이미지 url을 통해 Internal 서버에 접근하여 권한 취득.

 

이미지 주소로 입력된 url은 request를 우선 수행함.

adminIP가 127.0.0.1

/admin, /config, /log 등의 경로는 adminCheck() 후에 동작함.

따라서 adminIP로 해당 경로들에 접근.

 

config 경로에서 internal-api-URL 획득가능.

internal server에 user에 action으로 grant 값 주고, name에 특정 값 입력시에 해당 name으로 admin 권한을 주는 것을 확인할 수 있다.

http://internal-api.dreambank/user?action=grant&name=dream

이렇게 접근하면

반응형

'Security' 카테고리의 다른 글

[wargame] csrf-2  (0) 2021.09.25
[Webhacking] file vulnerability  (0) 2021.09.24
[Webhacking] path traversal  (0) 2021.09.24
[Webhacking] server side template injection (SSTI)  (0) 2021.09.24
[Webhacking] Command Injection  (0) 2021.09.23