webhacking/sql, sql injection

chall.tasteless.eu Tournament, Fred's cms

qkqhxla1 2015. 7. 27. 18:18

Tournament


한참을 삽질했다. 딱봐도 아래에 힌트가 쿼리로 나와있으니 sqli이고, name과 text를 입력받는것을 보아 insert문으로 들어가고, 대충 쿼리로 집어넣으면 될수 있음을 알 수 있다. 이것저것 가능한 경우의 수를 모두 대입해봤는데 별로 반응이 없었다. name에 \를 넣으면 text에는 어떤 값을 넣어도 출력이 제대로 안된다는걸 확인하고, name에 인젝션을 하면 된다고 생각했다.(text에는 \를 넣어도 제대로 출력된다.)


name에 a',(select flag from level15_flag))#를 넣어봤는데 계속 실패했다. 한참을 고민하다가 이전에 풀었었던 http://qkqhxla1.tistory.com/368 의 아래문제(Never Trust The Obvious) 에서 '를 넣으려면 \'로 넣었던게 기억났다. 그래서 a\',(select flag from level15_flag))#처럼 넣으니 성공했다. 근데 지금도 연구중인데 왜 하필 '만 넣으면 인젝션이 안되고, \'를 넣어야 인젝션이 되는지 모르겠다.


매직 쿼터 환경이라고 가정하면 \'를 넣으면 \\\'가 된다. addslashes함수가 있다고 해도 동일하다. mysql_real_escape_string함수도 동일하다. 도대체 쿼리를 어떻게 구성해야 \'가 넣었을때 '가 인젝션되는지 모르겠다. 더 연구해봐야겠다.



Fred's cms


admin으로 로그인하면 성공인데, 이것저것 해도 답이 없다. 멀티바이트 인코딩을 생각하고, %a1%27처럼 '를 넣어봤는데 안됬다. 멀티바이트 인코딩 범위가 %a1~%fe여서 하나하나 넣어보다 %ca%27처럼 넣으니 성공했다. 근데 왜 일부는 막아놓고 일부는 안막아놓은지는 잘 모르겠다.


username=admin&password=1234%ca%27<2%23