[Dreamhack] error based sql injection(+문제해결 완)

2022. 7. 14. 22:29web웹/Dreamhack wargame

 

init.sql 파일

위 sql문으로 추측할 수 있는 것은 'user'이라는 이름의 테이블이있고 각 튜플은 다음과 같은 값으로 채워진다는 것이다.

idx uid upw
  admin DH{**FLAG**}
  guest guest
  test test

 

app.py

uid = request.args.get("uid")를 통해서 값을 받아온 뒤 쿼리에 그대로 들어감

이용자 입력값이 별다른 검사 없이 SQL 쿼리에 포함되어 SQL Injection 취약점이 발생함도 알 수 있었다.

 

error based sql injection은 문법적 오류가 아닌 논리적 오류가 포함된 쿼리를 작성해야 가능한 공격이다.

문법오류는 아예 컴파일이 되지 않을 수 있기 때문이다.

 

다음은 문법오류를 발생시켰을 때의 결과입니다.

 

작은 따옴표를 입력해보았다.

 

특별한 정보는 얻어내지 못한듯함


고민을 하다가 드림핵 로드맵의 도움을 받기로 하였다.

나는 다음을 참고하여 문제를 풀어보았다.

[WHA] ExploitTech: Error & Time based SQL Injection | Dreamhack

 

로그인 | Dreamhack

 

dreamhack.io

 

extractvalue 응용

: extractvalue함수를 응용해 사용할 경우 데이터베이스의 정보를 추출할 수 있다.

 

#EXTRACTVALUE

  • 사용법 - EXTRACTVALUE(XML 형식의 값, XPath 조건식)
  • XPath 조건식을 지정해서 해당하는 XML노드의 값을 반환

XML데이터타입

 

이 함수는 첫 번째 인자로 전달된 XML 데이터에서 두 번째 인자인 XPATH 식을 통해 데이터를 추출

올바르지 않은 XPATH 식을 전달하면 에러 메시지에 삽입한 식의 결과가 출력되는 점을 이용한다.

 

*concat(): 문자열 합치는 함수

**사용법: concat(0x3a,(우리가 실행할 쿼리문))

admin' and extractvalue(1,concat(0x3a,(SELECT upw FROM user WHERE uid='admin')));#

위에 있는 쿼리문을 입력하고 submit을 하면 다음과 같은 화면이 나온다.

댓글에 플래그가 짤려있다는 말이 있었는데 이것도 해결을 해야하는 부분인듯하다.

substr()함수를 활용하면 될 것 같은데 잘 안돼서 좀 더 고민해봐야겠다.

 

좀더 생각해본 결과 concat() 2번째 인자부분을 수정하면 문자를 추출할 수 있을 것도 같다. 아직 시도 안해봄

 

 

 


문제해결

MySQL Error(Double Query, XML 내장함수) SQLi (rand(), floor(), limit, offset, ifnull, extractvalue(), updatexml()) (tistory.com)

 

MySQL Error(Double Query, XML 내장함수) SQLi (rand(), floor(), limit, offset, ifnull, extractvalue(), updatexml())

소스코드 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?php if(!$link = mysql_connect('localhost', 'root', 'root')) {         echo 'Could not..

johyungen.tistory.com

여기 글이 에러를 이해하고 해결하고 도움이 되었다.

 

결론적으로 xml 내장함수인 extractvalue()는 에러발생 시 출력되는 길이가 32Byte로 제한된다.

따라서 substr()또는 substring()으로 여러번 나누어 출력해주어 플래그를 확인해야한다.

32Byte가 넘지않도록 조절해서 출력해보았다.

 

난 그냥 직접 접속해서 했었는데 파일하나 만들어놓고 vsc에서 작업하는게 더 일반적이라고 해서 이번에는 그렇게 해봤다.

admin' and extractvalue(1,concat(0x3a,(SELECT substr(concat(0x3a,upw),20,40) FROM user WHERE uid='admin')));#

아까 나온 플래그랑 조합하면 원하는 플래그를 획득할 수 있다

 

나는 0x3a직접 입력하다가 대문자로 X를 써서 몇번 오류가 났었다 다른 사람들은 이런 실수 없기를 바란다.

'web웹 > Dreamhack wargame' 카테고리의 다른 글

[Dreamhack] web-ssrf  (0) 2022.08.16
[Dreamhack] XSS-1  (0) 2022.08.02
[Dreamhack] session  (0) 2022.07.26
[Dreamhack] session-basic  (0) 2022.07.26