본문 바로가기

web

SQL injection addslashes, utf-8 변환시 우회법 php mysql에서 addslashes를 이용해서 인젝션을 차단하고 있거나, euc-kr을 utf-8로 변환을 하는 작업이 있을경우, 멀티바이트를 이용해서 우회가 가능합니다.두가지 케이스 모두 솔루션은 같으므로, 한번에 설명하겠습니다. addslashes는 입력스트링 중에 quote(') 가 있다면 앞에 \를 붙여줌으로써, " \' " 로 변환됩니다.그래서, quote를 소용없게 만드는것이죠. 하지만, 멀티바이트로 보내면 소용이 없습니다. 예를 들어 url encoding 구문으로 %bf%27을 보낸다면, (%27이 quote입니다.)%bf%5C%27 로 변하게 되고. (%5C가 \ 입니다.)결국, %bf%5C 가 한글자로 읽히게 됩니다. (유니코드이기 때문에.)그리고 %27이 \의 간섭을 안받고 자유.. 더보기
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (Only mysql) Blind SQL injection은 아무래도 브루트포싱이다보니, 한글자를 알아내기까지 많은 쿼리를 보내야합니다.빠릿빠릿한 서버라면, 별 상관없을수도 있지만. 느린서버를 공략할때는 너무 답답합니다.하지만, LPAD,bin,ascii와 같은 함수들을 이용하면, 쿼리의 횟수를 확 줄일수 있습니다. 기존의 방법대로라면 한글자를 알아내기까지 최대 약 70개정도의 쿼리를 보내야 한다면.이 방법을 사용했을땐, 8번의 쿼리만으로 글자를 알아낼수 있습니다. 함수들을 설명해드리면,ascii는 캐릭터를 숫자로 변환하는 함수입니다.ex) 'A' -> 65, 'a' -> 94, '0' ->48 bin은 숫자를 2진법 형태의 스트링으로 변환하는 함수입니다.ex) 12 -> '1100', 65->'1000.. 더보기
Time-based Blind Injection 이번에도 문법은 MySQL 기준으로 설명하겠습니다. Blind SQL injection을 할때, True or False에 따라 결과값이 달라진다면, 간단히 해낼수있지만.True or False에 따른 화면 결과값이 달라지지 않을때가 있습니다. 그럴땐 if함수와 sleep함수를 이용하면 됩니다.그리고, 시간을 재야하기 때문에 파이썬등의 스크립트를 이용한 공격이 필수라고 생각됩니다.. Sleep은 대부분 아실텐데, sleep(x) 라면, x초간 멈추는겁니다. 그리고 if함수의 구성을 보자면,if(조건,참일때 결과값,거짓일때 결과값)입니다. 그래서 참일때, sleep(x)을 걸고, 요청을 보내서 response가 x초 이후에 도착했다면, True라고 판단하면 됩니다.물론, 평소의 response가 오기까지 .. 더보기
MySQL Injection에서 LIMIT, quote(따옴표) 우회법 따옴표(캐릭터) 우회 만약 따옴표(')가 필터링이 되어있는데, 캐릭터를 비교를 해야한다던가.. 하는 상황이 있다면ascii 를 사용하시면 됩니다.ascii는 캐릭터를 숫자로 바꿔주는 방식이므로, ascii(a) = 97 과 같은 형태로 따옴표없이도 비교할수 있습니다. LIMIT 우회 인젝션을 할때 LIMIT이 필터링 되어있으면 상당히 걸리적거립니다.그때 LIMIT을 우회하는 방법은, max(), min(), group_concat()을 사용하시면 됩니다. 사용법은 select max(컬럼) from ~~~ , select group_concat(컬럼) from ~~~ 와 같습니다.max,min은 예상하시다싶이, 결과값중 가장 높은 줄 하나, 낮은줄 하나만 불러오는것이구요. group_concat()을 이.. 더보기
SQL Blind Injection 제가 여기저기서 조금조금씩 주워듣고 해본것들을 정리하는것이기 때문에, 일반적인 용어가 아닐수도 있습니다.그리고, 문법은 MySQL을 기준으로 설명하겠습니다. (물론, 다른 SQL에서도 문법만 조금 달리하여 사용 가능합니다.) Blind Injection이란 True or False의 결과값을 이용하여 DB의 내용을 알아내는 기술을 말합니다. 예를 들어서 설명을 해보겠습니다. 어떤 테이블이 있고, search 기능을 통해 특정한 num을 불러오는 기능이 있다고 할때 그 search의 쿼리문은 select * from table where num=[원하는 번호] 대충 이런형태 일것입니다. 그러면, 만약 원하는번호에 "1 and 1=1 #" 를 넣는다면,select * from table where num=1.. 더보기