write-ups/Lord of SQL Injection

[Lord of SQL Injection] umaru solving..

2017. 2. 16. 22:53

말그대로 umaru 문제를 풀면서 작성하는 글

- H3X0R, s1ipper 팀 소속 윤석찬(ch4n3) -

진짜로 말 그대로 umaru문제를 풀면서 작성하는 /tmp/ 스러운 포스팅입니다. 



사실 방금 대단한 것을 발견했어요. Time Based SQL Injection이죠. 

mysql> update login set no=0 where id='admin' and sleep(ord(mid(pw,1,1))=80);

Query OK, 0 rows affected (1.00 sec)

Rows matched: 0  Changed: 0  Warnings: 0

update 문을 공략할 수 있다는 거죠. (이 mysql은 localhost입니다.)

sleep() 함수의 리턴값은 0이기 때문에 and 연산으로는 무조건 거짓이 되게 됩니다. 


하지만 sleep()함수 자체의 프리징은 아무런 변화없이 실행됩니다. 따라서 문제를 풀 수 있을 것 같습니다. 


특히 where 문이 sleep()과 and로 거짓이 되면서 값이 바뀌지 않으니까 확실히 되겠네요. 감잡았습니다. 이제 파이썬 스크립트를 짜러 갈꺼에요.



친구가 update문을 사용하지 못하게 하라고 하네요. 뭔소린지 대체 모르겠지만, 일단은 실행시키지 않으려면 where 문을 이상하게 고치거나, 오류가 나게 해야할 것 같네요. 


그래서 브라우저 console 창에서 

document.cookie="PHPSESSID=asdfas"; 

이렇게 고쳤더니 다시 로그인하래요.



그렇게 곰곰히 생각해봤는데 첫번째 update문이 아닌 두번째 update문을 공략해야할 것 같아요. 

제 생각에는 prob_rubiya 에 flag가 저장되어있는 것 같습니다. 



===2017.02.22===

일단 세션 변수를 사용하는 쿼리는 조작할 수 없는 것 같다. 그래서 $_GET[flag]를 사용하는 쿼리에 집중해야겠다. 



===2017.03.05===

일단 3월로 넘어왔다ㅋㅎ

prob_umaru하고 prob_rubiya의 flag들이 같을까 같으면 대충 blind sqli로 풀겠는데 다르다면 푸는 데 꽤 골치 아플 것 같다. 


mysql> update test set no=(select ord(substr(id,1,1))=97);

Query OK, 0 rows affected (0.01 sec)

Rows matched: 1  Changed: 0  Warnings: 0

이 쿼리가 참이니까 서브쿼리를 이용해서 해야하는 걸까 그럼 대충 prob_rubiya의 flag를 알아올 수 있을 것 같기도 하다. 뜬금포지만 varchar형을 update문으로 int형으로 바꿀 수 있다는 것을 알게되었다.


http://los.eagle-jump.org/umaru_6f977f0504e56eeb72967f35eadbfdf5.php?flag=(select%20sleep(10))


왜 이런 쿼리가 영향을 주지 않을까. 10초를 멈추지 않는다. 조금 이상하다. 왜 안멈추지

http://los.eagle-jump.org/gremlin_bbc5af7bed14aa50b84986f2de742f31.php?id=%27||sleep(10)%2B1%23

여기서 10초 멈추는데, 이걸로 봐선 LoS 서버에 문제가 있는 것도 아닌 것 같다. 뭐가 문제일까 대체. 

내 local mysql에서 update문에 (select sleep(10)) 하면 잘 됐었는데 진짜 뭐가 문제인지 정확히 모르겠다. 갈피를 못잡겠다.