이 문제부터 조금씩 어려워지기 시작했다.
Secret Agents 라는 웹 해킹 문제이다.
문제설명을 읽어보면 secret agent portal 에 접속할수 있냐고 물어본다.
그리고 유출된 웹 페이지의 소스코드가 힌트로 제공이 된다.
문제페이지에 접속해보면
그냥 누르면 너는 여기 접속하는게 허용되지 않았다고 하면서 튕거버린다.
웹해킹좀 해봤던 사람이면 여기까지 왔을때 눈치를 챘을것이다.
이 문제는 웹 요청 패킷의 User-Agent 헤더값을 수정하면 풀 수 있는 문제이다.
User-Agent 헤더 클라이언트가 서버에 자신이 어떤 브라우저를 사용하는지 알려주는 역할을 한다.
가령 우리가 컴퓨터로 네이버에 접속할때랑, 폰으로 네이버에 접속할때 UI 가 다른데,
그게 바로 User-Agent 헤더에서 폰으로 접속했다는 정보를 담고 있기 때문이다.
@app.route("/login")
def login():
u = request.hearders.get("User-Agent")
이부분을 보면 요청 헤더에서 User-Agent 값을 가져와, u 라는 변수에 담는것을 볼 수 있다.
for i in cursor.execute("SELECT * FROM Agents WHERE UA='%s'"%(u), multi=True):
여기서는 u라는 변수의 값을 이용하여 데이터베이스에서 정보를 가져오는것을 볼 수 있다.
이렇게 DB와 웹 서버가 상호작용하는 부분에서는 SQL 인젝션 취약점이 발생하게 된다.
burp suite라는 프록시 도구를 이용해서 웹 요청 패킷을 잡은 뒤에,
SELECT * FROM Agents WHERE UA='a' or 1=1#' 이런식으로 변조가 될 것이다.
#은 SQL에서 주석을 의미하고
1=1은 참, 참과 or을 하면 앞에있는 WHERE 절도 참이 되기 때문에
쿼리는 항상 참이되어서 DB에 있는 모든 결과물이 나오게 될 것이다.
위의 응답 패킷에서
hey! close, but no bananananaana!! 라는 값이 나오게 된건
소스코드의 이 부분 때문이다.
if len(res) == 0:
return render_template("login.html", msg="stop! you're no allowed in here >:)")
if len(res) > 1:
return render_template("login.html", msg="hey! close, but no bnanananan!!!!")
return render_template("login.html", msg="Welcome, %s"%(res[0][0]))
'CTF > 웹해킹' 카테고리의 다른 글
[Space Heroes CTF] Space Buds - 웹해킹 / 쿠키변조 (32) | 2022.04.08 |
---|---|
[Space Heroes CTF] R2D2 - 웹해킹 / robots.txt (48) | 2022.04.07 |
[Space Heroes CTF] Space Traveler - 웹해킹 / 자바스크립트 (29) | 2022.04.06 |
[angstromCTF] Consolation - 웹해킹 / 자바스크립트 (46) | 2022.03.17 |
[angstromCTF] The Magic Word - 웹해킹 / 자바스크립트 (42) | 2022.03.11 |