2022. 4. 6. 18:11ㆍSite/LOS
이번시간에는 nightmare을 풀어보겠습니다
공부하는 입장이니 틀린 것이 있더라도 양해부탁드립니다
소스코드를 보니 prob _ . ( ) # - 들이 필터링 되어있어서 사용이 불가능하고 pw값의 길이가 6보다 크면 안됩니다
pw값을 참으로 만들어줘서 그냥 id값만 나오면 해결이 될 것 같은데 문제는 pw('')부분하고 id!='admin'을 주석처리하고 싶은데 # --가 필터링 되어있어서 할 수가 없다는 점입니다
이 문제를 풀기위해서는 sql 자동형변환을 이용해야되는데 pw('')을 취해주면 sql에서 문자열 char보다 int형이 우선함으로 char형인 pw('')문자열 -> int형으로 변환 -> 0을 리턴 -> 0=0을 해주면 일치되어 모든컬럼을 출력할 것 같습니다
*
SQL에서는 자동형변환에 의해 " 문자열은 숫자 0으로 반환됨
ex)
table name : information
id(VARCHAR) | name(VARCHAR) |
0 | name1 |
id2 | name2 |
id0 | name3 |
SELECT * FROM information WHERE id=0;
-> 문자는 0으로 반환되기 때문에 모든 컬럼값을 다 출력함
*
접근방법
1. 먼저 pw('')과 0을 일치 -> pw=('')=0') and id!='admin'
이렇게되면 pw=('')가 0으로 변환되고 0과 비교하여 pw와 일치하는데 ') and id!='admin' 부분을 주석처리를 해주어야 됩니다. 하지만 필터링 우회로 역시 # -- 을 사용하여 주석처리가 불가능합니다
2. ; 와 NULL[ %00]을 사용
pw=('')=0;') and id!='admin'
;은 쿼리를 마치는 부분인데 이렇게하면 pw=('')=0; 이라는 정상적인 쿼리문이 완성됩니다
하지만 ') and id!='admin' 부분은 쿼리문이 맞질 않기 때문에 오류가 발생할 텐데 NULL을 사용하면 될 것 같습니다
NULL을 사용하면 ;이하의 부분을 읽지를 않게 됩니다
최종 쿼리문
-> pw=%27)=0;%00