nightmare

2022. 4. 6. 18:11Site/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

'Site > LOS' 카테고리의 다른 글

dragon  (0) 2022.04.13
xavis  (0) 2022.04.13
zombie assassin  (0) 2022.04.06
succubus  (0) 2022.04.05
assassin  (0) 2022.04.05