los 25번입니다.
문제 코드를 보면 1차 쿼리문을 만족 시켰을 때 1차 쿼리문의 결과 값으로 2차 쿼리문을 실행합니다. 이때 2차 쿼리문의 결과의 id가 admin일 경우에 문제가 풀리는 것 같습니다. 일단 싱글 쿼터가 필터링 되어 있기 때문에 1차 쿼리문의 싱글 쿼터를 우회해주기 위해 los 17번에서 했던 것처럼 \를 넣어줍니다. 이렇게 되면 'and pw='가 묶이게 되어 pw에 들어가는 값이 id값으로 설정되게 됩니다. 그리고 처음에 단순히 admin과 admin을 아스키코드로 바꾼 0x61646d696e를 넣어지만 문제가 해결되지 않았습니다.
그래서 여러가지 삽질을 하던 도중 union select 문으로 여러 개의 칼럼을 가져와봤습니다.
그러니 위 사진처럼 2번째 쿼리문이 출력되었다는 것을 알 수 있었습니다. 이때 union select 1,2를 할 때 id=1, pw=2가 되어서 이 값을 다른 숫자로 바꾸었더니 다른 값으로 들어가는 것을 확인했습니다. 두 번째 쿼리문도 싱글 쿼터를 우회해야 하기 때문에 id=\가 되어야 하는데, 이때 문자 \를 넣어주면 두 번째 쿼리문을 가져올 수 없습니다. 그래서 아스키코드인 %5c를 넣어주어서 우회했습니다.
그리고 이제 id에 적절한 값을 넣어서 두 번째 쿼리문의 결과값의 id가 admin이 되게 설정해야 합니다. 여기서도 union select 문을 사용하면 됩니다. union select 문을 이용하여 admin인 칼럼을 가져오는 것입니다. 그런데 문제점이 단순히 union select 0x61646d696e를 넣어주게 되면 문제가 해결되지않습니다. 그래서 union select 0x61646d696e를 모두 한글자씩 아스키코드로 변화하여 넣어주어야 문제가 해결됩니다.
정답 : ?id=\&pw=union select 0x5c, 0x756e696f6e2073656c6563742030783631363436643639366523%23