about_SC
2019. 8. 21. 11:35
[LOS] ouroboros
참신한 내용의 문제였다.. 푸는데 한참이나 걸렸다. ^^
1)
문제를 보았다. 별다른 필터링은 존재하지 않았고, 참이 되는 쿼리를 입력하면 쿼리가 실행되어 패스워드 컬럼의 첫번째 값을 화면에 띄워줄거라 생각했다. ex) ?pw=' or 1=1# 그 결과, 값이 화면에 나타나지 않았다.
2)
혹시, 널 값이 아닌 값이 있나 궁금해서 like % 문을 이용하여 컬럼 값을 검색해보았다. ex) ?pw=' or pw like '%'# 그 또한, 화면에 값이 나타나지 않았다. 값이 존재하지 않는 테이블인거 같다.. union을 사용하면 되지 않을까?
3)
union 을 사용하여 간단하게 쿼리를 작성해보았다. ex) ?pw=' union select 1%23 그 결과, 화면에 1이라는 값을 출력해주었다.
이런 방식으로 문제를 풀면 될거 같은데, 내가 입력해준 $_GET['pw']의 값과 쿼리가 실행된 $result['pw']의 값이 같게 만들려면 어떻게 해야될지.. 감이안온다.. 구글에 도움을 청해보기로 하자..
4)
구글에 검색해보니 Quine(콰인?)이라는 검색어가 눈에 들어왔다. 위키백과에 따르면, Quine은 소스코드를 그대로 출력으로 반환하는 프로그램을 의미한다고 한다. 만일, 위 문제와 같이 사용자가 전달한 값과 쿼리의 결과 값이 동일한지 확인하는 검증로직이 존재할 때 이를 응용하여 악용하면 인증우회가 가능해진다고 한다. 자세한 내용은 사전에 기재한 블로그 글을 참고하자. (https://aboutsc.tistory.com/147 )Payload
a' union select replace(replace('a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23',char(34),char(39)),char(36),'a" union select replace(replace("$",char(34),char(39)),char(36),"$") as pw%23') as pw%23
해당 쿼리를 실행한 결과, 인증이 우회되어 문제풀이가 성공하게 된다.