webhacking/sql, sql injection

wargame.kr tmitter

qkqhxla1 2014. 10. 4. 17:18

들어가기전에 테이블 구조가 있다. 


you need login with "admin"s id!

===========================

create table tmitter_user(
idx int auto_increment primary key,
id char(32),
ps char(32)
);

그리고 들어가보면 조인(회원가입)과 로그인 두개밖에 없다. 조인에서 아무거나 만들고 로그인으로


들어가보면 글 쓰는 페이지가 있다. 글에는 필터링이 되어있는지 아무거나 입력해봐도 다 나온다.


테이블 구조가 문제 들어오기 전에 보이고, 페이지가 조인, 로그인 두개밖에 없으면 당연히


sql문에서 insert문을 공략하는 문제이다. 그리고 insert문을 공략하는 방법이면 가장 흔한


insert into 테이블 values(a,b,c), (d,e,f); 이런식으로 다중 값을 넣어서 계정을 만드는... 그런


방법이라고 생각했다. 조인에서 소스를 보면 주석으로 admin으로 join해야 된다고 친절하게 설명까지 


적혀있다. 간단한데? 라고 생각하면서 테이블 구조를 보면서


id='axs',   ps=1234567'),(-1,'admin','1234567 등으로 인젝션을 해보았으나 되지 않았다.


나중에 발견하니 id에 axs를 넣고, ps에 1234567'),(-1,'admin','1234567 이값을 그냥 통째로


넣으니 로그인이 되는 것으로 보아 ps쪽에 mysql_real_escape_string, addslashes등의 함수로


잘 막아놓았다고 추측해볼 수 있었다. 그러면 id쪽에 인젝션을 하기로 하고 id쪽에도 삽질을 해보니


되질 않았다. 주석문인 #도 아이디에 그대로 남아있고, 아이디에 asdf'처럼 입력해서 가입한다음


다시 똑같은 asdf'로 가입하려고 하면 아이디가 이미 있다고 뜨는데, asdf\'가 이미 있습니다!


라고 뜨는 것으로 보아 아이디에도 위와 같은 sqli방지가 되어 있는것 같다. id와 ps에 둘다


sqli방지가 되어있으면 일반적인 문자밖에 쓰질 못한다. '는 인코딩 관련 취약점이 있지


않는이상 쓰질 못하니까 insert into관련 취약점이 아닌 것 같다. 


(%00의 널문자도 써봤지만 막히는걸 확인했다.) 다시 테이블구조를 살펴보니


id와 ps가 32자란걸 떠올렸다. 내가 만약 33자를 입력하면 끝 1자리는 그냥 버려진다는 소리이다.


처음에 가입할때 중복체크를 하는데, 만약 'admin                          a'처럼 입력하면(''안에 33글자.) 


끝의 a는 버려지고, 아이디 중복체크시 'admin                          a'라는 아이디가 없을테니


넘어가는게 당연하고, 중복체크 이후 insert into로 삽입할때는 admin만 삽입된다.(뒤 공백 무시)


똑같은 테이블을 만들어봤다.



잘 된다.


이런식으로 데이터를 변조해서 보냈더니 제대로 로그인이 되는걸 확인할 수 있었다.

'webhacking > sql, sql injection' 카테고리의 다른 글

wargame.kr ip_log_table  (0) 2014.10.06
wargame.kr web_chatting  (0) 2014.10.06
webhacking.kr 18번.  (0) 2014.10.03
wargame.kr DB is really GOOD  (0) 2014.10.01
information_schema  (0) 2014.09.28