webhacking/sql, sql injection

chall.tasteless.eu Unsolvable, Never Trust The Obvious

qkqhxla1 2015. 7. 4. 16:37

Unsolvable.


들어가보면 admin으로 로그인하라고 한다. register을 통해 가입할수 있다.

가입을 할때 성공적으로 가입하면 아이디 : 비밀번호 형식으로 잘 가입됬음을 알려준다.


처음에는 insert문에 인젝션하는거인줄 알고 아이디에 a','1234'),('admin','1234')# 이런식으로 입력을 해봤는데, 결과가 이리 나왔다.


new user has been registered: a\',\'1234\'),(\'adm : 1234


뒤의 1234는 내가 입력한 비밀번호이고, 아이디를 살펴보면 20글자에서 잘렸음을 알 수 있다.

그러면 아이디를 admin               1 (21글자)로, 비밀번호를 1234로 입력하면 어쨋든 아이디는 다르니까 admin이 안나오고, 가입시에는 20자리까지 즉 맨마지막의 1은 없어져서 잘 가입될걸 예측할 수 있다.


admin               1로 아이디를 가입하면 답이 나온다.




Never Trust The Obvious


그냥 로그인하는게 목적이다. 처음에는 일반적인 ' or 1=1#이런걸 해봤는데 별 소용이 없었다. 이것저것 삽질을 해보다가 아이디에 \를 입력하면 비밀번호에는 어떤걸 입력하더라도 Sql error! 라는 에러가 발생한다는걸 발견했다.


또 \에 관해서 삽질을 해보던중 \"나 \\, \asdfasdfasdf처럼 \뒤에 뭘 입력하던 그냥 login failed만 뜨는데, \'나 \'', \''''''''처럼 \뒤에 홑따옴표를 입력시 또 Sql error!이 발생하는걸 발견했다.


쿼리를 대충 예상해봤는데 쿼리는 일반적인 쿼리이고, 필터링만 조금 다르게 될것이라는걸 확인했다.

매직쿼터가 on인가? 라고 추측해봤는데 \''''''같이 홑따옴표만 다른 에러만 뜨는걸보고 확신할수 있었다.

\'처럼 입력했을때 sql관련 에러가 뜨는걸로 보아 그냥 '처럼 입력했을때와는 달리 \'처럼 입력해야 홑따옴표가 제대로 삽입됨을 확인할 수 있다. 그렇다면...


결국 쿼리는 select * from table where id='$_POST['id']' and pw='$_POST['pw']' 뭐 이런식일텐데 여기서 \와 '가 같이 입력되야지만 인젝션이 가능하다.(왜그런지는 연구중.) 아이디에 \'<2# 처럼 입력하면

where id='\\'<2#' and pw='$_POST['pw']' 

처럼 되어 true라고 추측할수 있었고, \'<2#을 넣어서 bypass할수 있었다.