level18[old]

2022. 3. 18. 23:07Site/Webhacking.kr

이번시간에는 level18을 풀어보겠습니다

공부하는 입장이라 틀린것이 있더라도 양해부탁드리겠습니다


level18번을 클릭했더니 sql injection이라는 문제가 뜹니다

 

*

sql injection : sql injection(SQL 삽입, SQL 주입으로도 불린다)은 코드 인젝션의 한 기법으로 클라이언트의 입력값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격방식을 말합니다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다고합니다. reference check : https://namu.wiki/w/SQL%20injection

*

 

일단 아무 값인 0을 입력했더니 아무런 반응이 없네요

view-source를 눌러서 소스코드를 보았습니다

빨간색으로 박스표시된 php부분이 메인인것 같습니다

preg_match함수를 통해 $_GET['no']변수 중에 / |\/|\(|\)|\||&|select|from|0x/i이 있다면 no hack을 출력하고 종료합니다

[= no 필터링] 

chall18 테이블에서 id가 guest고 입력받은 no를 변수 no에 대입하여 일치하는 id값을 선택하네요

위에서 받은 id값을 result변수에 저장하여 id값이 guest이면 hi guest출력

id값이 admin이면 hi admin을 출력하여 문제가 해결됩니다...

일단 저희는 저 admin의 no값을 파악하는게 우선인것같은데 힌트로 admin's no가 = 2라고 나옵니다

일단 1을 입력하여 id값이 guest가 잘 출력되는지 확인했습니다

이경우 쿼리문이 where id='guest' and no=형태가 되어서 출력되는것 같네요

근데 이 문제에서는 no = 2여야지 원하는 admin id값이 나와 해결이됩니다

 

위에서 보았던 쿼리문을 참조해야될것같은데 [where id='guest' and no=$_GET[no]]

 

id값이 guset로 되어있어서 no값을 안다하더라도 admin을 출력할수없습니다...

하지만 id값을 바꿀수 없다면 guest의 no를 false값으로 주면 괜찮을것같습니다

guest의 no가 1이고 admin의 no가 2인것을 확실히 알았습니다

맨처음 제가 0을 입력하였을때 guest도 아니고 admin도 아니도 기타 다른 id의 값도 아니어서 어떠한 출력값도 나오지 않았습니다

-> guest의 no값에 어떠한 id값도 아닌 0을 주고 amdin의 no인 2를 추가하여 

where id='guest' and no=0 or no=2 형태로 만들면 

id가 guest고 no가 0인 값을 조회하고 없다면 no가 2인값을 조회하라고 수정해주면 될 것 같습니다

그러면 파란색부분은 의미없는 값이 되어 넘어가고 초록색부분이 true값이 될 것 같습니다

 

실행을 해보았더니 no hack라고 뜹니다

아마 preg_match함수에서 $_GET[no]를 필터링한거 때문인거 같습니다... [공백때문인것같네요]

찾아보니 sql필터링우회방법을 활용해야 될것 같습니다

 

*

공백 문자 우회

Space (%20)

TAB (%09)

Line Feed : 엔터 (%0a)

*

이중저는 0 or no=2의 공백부분대신  %09를 추가하여 작성하였습니다

GET방식이므로 url에 값을 입력하면 클리어 됩니다

'Site > Webhacking.kr' 카테고리의 다른 글

level1[old]  (0) 2022.03.21
level24[old]  (0) 2022.03.19
level26[old]  (0) 2022.03.17
level16[old]  (0) 2022.03.16
level15[old]  (0) 2022.03.15