본문 바로가기

Computer Security/CTF

[Codegate 2013] Web 400 simple write up

이 문제는 if문과 rand를 이용한 문제


수학문제 4문제가 주어지고, 다 풀면 원래는 700점이 한계인데, 3000점을 넘어야한다.


처음엔 blind injection을 통해 숨겨진 문제를 찾는거라 생각했다.

그래서 시간을 좀 많이 소모했다.


근데 블라인드 인젝션을 힘겹게 해서 데이터를 다 보고나니, 포인트가 있는 문제는 그 4개가 전부였다.


그렇다면, 방법은 1,2,3,4번 문제를 여러번 풀어야 한다는 소리인데..


파라메터를 조작해서 인젝션을 하다보면, 정답에 + or 1 like 1 #만 붙이면 클리어가 뜨는걸 알수 있다.


첫번째 쿼리에서 이미 풀었는지 확인을 하고, 

두번째 쿼리에서 문제의 포인트를 불러오고,

세번째 쿼리에서 불러온 포인트를 이용해 업데이트 한다.


이렇게 추측했다.


그렇다면 첫번째 쿼리와 두번째 쿼리에서 다른 문제를 불러오도록 한다면 될거라 생각했다.

첫번째에선 안풀었던 문제 번호를 불러오거나 대충 5번 이상의 문제번호를 불러도 안풀었다고 생각한다.

그리고 두번째 쿼리에선 1~4번 문제의 포인트를 불러오게 해야한다.

이건, mysql의 랜덤 함수를 이용해서 할수있다.


if(랜덤값이 1일경우,1,5)

라고 문제에 넣게 되면, 1또는 5가 랜덤으로 배정되기때문에 일정 확률로 already clear가 안뜬다.


즉, auth.php?p=if((select cast(rand()*2 as signed))=1,1,5)&k=1+or+1+like+1+#


이런식으로 넣어주면 되었던것 같다... (정확히는 기억이...)


이렇게 몇번 반복해서 시도하면 3000점이 넘는다