Lord Of SQL injection 32단계-alien
LOS 포스팅에 앞서 내용이 틀릴 수도 있으며, 해당 부분 지적은 감사히 받겠습니다.
32단계 소스코드이다.
쿼리가 두 개 있고 파라미터는 no를 받으며 admin, and, or, if, coalesce, case, _, prob, time 등이 대소문자 구분 없이 필터링되어있다.
또한 query2는 query1과 달리 no에 싱글 쿼터 처리가 되어있다.
문제를 해결하기 위해 4개의 조건을 만족해야 한다.
각 조건은
1. query1 = admin
2. query1 != admin
3. query2 != admin
4. query2 = admin
이다.
처음엔 이게 무슨 말인지 몰라서 조금 시도하다 인터넷 검색을 했다.
1,3 2,4 조건이 같이 실행된다. (추측)
정답은 시간에 따라 id의 값을 바꿔주면 된다.
일단 query1과 2가 같은 쿼리문을 실행하도록 해줘야 한다.
? no=0 union select 1 --+- 'union select 1 --+-
위와 같이 쿼리를 삽입하면 query1에선? no=0 union select 1 --+- 이 되어 뒷부분이 주석 처리되고
query2 에선 'union select 1 --+- 의 싱글 쿼터가 앞의 쿼리를 문자열 처리해줘서 실행 값을 같게 만들어 줄 수 있다.
이제 시간에 따라 query의 값이 admin이며 아니게끔 만들어 주면 된다.
query1과 query2이 동시에 실행되니 query1의 값과 query2의 값을 시간에 따라 반전시키는 코드를 짠다.
?no=0 union select concat(char(97%2b(!sleep(1)%26%26now()%2=1)),0x646d696e)--+-'union select concat(char(96%2b(!sleep(1)%26%26now()%2=1)),0x646d696e)--+
now()%2=1 부분에 의해 함수의 문제 해결 정확도는 50%를 가지고 있다.
1. 첫 번째 경우
2. 두 번째 경우
문제 해결
추측했던 부분에서 추측이 맞는지 확인하기 위해 여러 번 시도했다.
만약 조건문 1234 가 짝을 지지 않고 수행될 경우 25%의 성공률을 가질 것이고 13,24로 짝을 지어 수행될 경우 50%의 성공률을 가질 것이다.
여러 번 반복 수행했지만 느낌상 1:1 비율로 나눠졌다. 따라서 조건문은 짝을 지어 수행된다. (아닐 수 도 있음)
시행착오
1. &를 인젝션에서는 %26으로 사용해야 함
2. + 또한 %2b로 사용해야 한다.
3. no파라미터는 문자를 받지 않는 걸 추측해 문자열 우회를 해줘야 한다. ex) no=a --> no=char(97)
4. sleep(1) 앞에! 가 오지 않으면 문제가 해결되지 않는데, 왜 와야 하는지 모르겠다..
사실 너무 대충 한 거 같아 찜찜함이 많이 남는 문제다. 제대로 검증 못한 것들이 너무 많아 추후 다시 공부하면서 익혀야겠다.