해결된 질문
작성
·
506
1
안녕하세요.
[SQL 인젝션에 대한 이해] - "검색 기능에 대한 올바른 취약점 점검 방법" 강의
11분 41초 부분을 따라하면서 테스트하고 있는데요.
강사님께서는 오라클 연결연산자( || )를 예로 들어서 설명해주셨느데요.
저는 mysql를 대상으로 테스트하고 있습니다.
mysql은 연결연산자가 공백이잖아요? 그래서 버프 스위트로 다음과 같이 쿼리를 날리는데 에러가 나고 있습니다. 무엇이 잘 못 되었는지 잘 모르겠습니다.
search_type=all&keyword='+(case+when+1=1+then+'test'+else+'1'+end)+'
에러:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(case when 1=1 then 'test' else '1' end) '%' or writer like '%' (case when 1=1 t' at line 1
한번 봐주시겠어요?
답변 2
1
안녕하세요. 크리핵티브 강사님 저는 위와 관련하여 추가적인 질문이 있습니다.
질문자님 께서 질문 주신 사항과 관련하여 제가 나름대로 해결책을 찾아보려고 했는데 추가적인 질문사항이 발생했습니다.
일단 검색기능을 이용해서 검색을 하면 MySQL 게시판일 경우 index.php코드를 통해서 동작하기 때문에 먼저 C:\APM_Setup\htdocs\board\mysql\index.php 코드에서 검색 기능 동작부분을 살펴봤습니다.
아래 붉은 상자로 표시한 부분에 질문자 님께서 작성한 쿼리문을 넣게 되면
select * from {$tb_name} where title like '%{$keyword}%' or writer like '%{$keyword}%' or content like '%{$keyword}% 이 부분에 들어가서 아래와 같이 될 겁니다.
select * from tb_board where title like '%'+(case+when+1=1+then+'test'+else+'1'+end)+'%' or writer like '%'+(case+when+1=1+then+'test'+else+'1'+end)+'%' or content like '%'+(case+when+1=1+then+'test'+else+'1'+end)+'%
case when 조건문이 동작하게 되면 아래와 같이 동작 될 것 입니다.
select * from tb_board where title like '%''test''%' or writer like '%''test''%' or content like '%''test''%
싱글쿼터로 닫힌 상태에서 test가 쿼리문이 들어가기 때문에 에러가 발생하다고 생각했습니다.
그래서 저는 아래와 같이 case when 구문을 고쳐 보았습니다.
(case+when+1=1+then+test+else+1+end)
[burp에 넣는 request부분]
[실행결과]
-> 쿼리문은 동작하는 것 같은데
--> 아무런 게시물을 검색하지 못합니다.
case when 구문이 back end 단에서 동작할 때 특이하게 동작하거나 주의 해야 할 사항이 있는 건지 궁금합니다.
0
안녕하세요.
답변이 늦어서 죄송합니다.
mysql 의 경우는 문자열과 문자열 사이에 의미없는 문자 공백, 개행, 탭 등의 문자가 있을때 연결을 해줍니다. 즉, 문자열 사이에 의미 없는 문자가 있을 경우 붙여준다는 말이죠.
그런데 문자열과 문자열이 아닌 함수, 서브쿼리 등 순수 문자열이 아닐 경우 문장 에러가 발생하게 됩니다. 연결이 안된다는거죠.
[문자열] [공백] [함수, 서브쿼리] => 에러 발생
때문에 이에 대한 활용은 MySQL에서는 할 수 없고, MSSQL, ORACLE에서는 활용이 가능합니다.
제가 이에 관련하여 강의 영상에 설명을 빠트린것 같네요. 추후에 영상 추가를 하도록 하겠습니다.
위에 제가 댓글 달어놓은거 참고하시구요.
문자열을 작성 시 싱글쿼터 처리 반드시 해주셔야 합니다.
test => 'test'
그리고 문장은 원래 에러가 발생하는 문장이 맞습니다.
mysql에서 구문 실습을 해보시면 알 수 있습니다.