문제 풀이 ereg함수를 통해 "admin"이 필터링 되었다. ereg함수는 preg_match 함수와 비슷한 함수이다. ereg('찾고자 하는 문자', '필터링 할 문자열') -찾고자 하는 문자가 있으면 True, 없으면 False를 출력 -대소문자 구별 x 아무튼 id값을 admin으로 받아와야 하는데 필터링이 되었으니 이를 우회해야한다. ereg함수를 우회하기 위해서는 어떻게 해야할까? 1. 대소문자 적절히 섞는다. 예를 들어, admin이면 ADMIN, Admin 등 2. %00 후 문자열 작성을 한다. 1번 방법으로 우회해보았다.
문제 id가 admin이고 pw가 $_GET[pw]인 데이터 중 pw를 받아온 다음 이 pw가 존재하고 pw가 $_GET['pw']와 같으면 풀린다. 풀이 orc문제와 비슷하다. 오크하고 오우거하고 비슷하게 생겨서 비슷한 문제인가 보다 유의해야 할점 1. or와 and를 쓸수 없는 점. 쓰면 HeHe가 뜬다. 2. pw가 존재하고 결과값의 pw와 입력값의 pw가 같아야 한다. 3. addslashes( string $str ) : 큰따옴표, 작은 따옴표 앞에 역슬래시 문자를 붙여주는 함수 Blind SQL Injection을 통해 pw를 알아야한다. length함수를 이용하여 pw의 길이를 구한다음 substr함수를 이용하여 하나씩 비밀번호를 구하는 방법이 있다. 그러나 이번에는 자동화 프로그램을 이용해..
id가 admin이면 풀린다. 공백문자가 필터링 되어 있다. 공백문자를 필터링되어 있을 경우 %09, %0a, %0b, %0c, %0d, %a0, /**/ 를 사용하면 된다. 따라서 php뒤에 다음과 같이 써주면 된다. id=guest&pw='%09or%09id='admin 풀렸다.
pw가 존재하고 결과값의 pw와 입력값의 pw가 같아야 한다. addslashes( string $str ) : 큰따옴표, 작은 따옴표 앞에 역슬래시 문자를 붙여주는 함수 이 함수 때문에 앞에서 했던거 처럼 할 수가 없다. 따라서 Blind SQL Injection을 통해 pw를 알아내야 한다. [Blind SQL Injection] Blind SQL Injection은 다음과 같은 상황에서 사용 가능하다. 1. 쿼리문으로 참과 거짓 일때의 서버의 반응을 알 때 2. 원하는 결과를 얻을 데이터베이스의 이름을 알 때 이러한 상황일때 쿼리 문의 ascii, limit, substr 등의 구문을 이용한다. 1. ascii ascii는 ascii(문자) 를 하였을때 해당 문자의 아스키코드를 반환한다. 2. li..
들어갔더니 다음과 같이 뜬다. id가 admin이어야 풀린다. 그럼 guest를 일단 무력화해야될것이다. 먼저 no에 1을 넣어보았더니 다음과 같이 뜬다. no에 1을 넣으니 Hello guest라 뜨니깐 이 부분이 실행이 되었다는 뜻이고 그말은 no가 1일때 guest라는 뜻일것이다. 그럼 무력화 시킬려면 no에 1을 제외한 값을 넣으면 될거 같다. id='guest'&no=100 or id='admin' 이라고 썼더니 다음과 같이 나온다. admin값을 16진수로 바꿔보았다. 16진수로 바꾸면 0x61646d696e 이다. 이것을 다시 넣어보았다. id='guest'&no=100 or id='0x61646d696e' 라고 쓰면 안된다. id='guest'&no=100 or id=0x61646d696e..
들어가면 다음과 같은 화면이 뜬다. id가 admin이면 이 문제는 풀리는 거 같다. md5함수가 있는데 이 함수에 대해 찾아보았다. md5는 128비트의 해시 값을 생성하는 해시 함수이다. md5는 단방향 암호화이기 때문에 출력값에서 입력값을 복원하는 것은 절대 불가능하다. 따라서 pw의 값은 우리가 구할수 없고 그렇기 때문에 필요가 없을 것이다. pw값을 무시하기 위해서는 주석처리를 해야될 것이다. 주석 처리를 하기위해 #을 사용한다. 처음에 php뒤에 id=admin#을 했더니 문제가 풀리지 않았다. #은 %23이므로 %23으로 다시 id=admin%23을 해주었다. 그랬더니 이렇게 나온다. id에 #이 들어갔기 때문에 admin까지 id가 되지 않고 그렇기 때문에 admin만 따옴표로 묶어줘야 될..
들어가보면 다음과 같은 화면이 나온다. id값이 존재하면 gremlin은 풀릴것이라고 예상이 된다. $_GET[id]와 $_GET[pw]를 통해서 id와 pw를 값을 받아올것인데 이때 query 문이 id="" and pw=""이므로 id와 pw값이 둘다 존재해야 될것이다. 따라서 sql의 가장 기본 구문 '1' or '1'='1'을 사용한다. id값에는 아무거나 들어가면 참이 나온다. 근데 pw에는 아무거나 들어가면 참이 나오지 않는다. 따라서 pw = '1' or '1'='1' 이라고 작성을 하면 pw은 1이거나 1=1라는 것이다. 근데 1=1은 무조건 참이 되기 때문에 pw은 참이 될수 밖에 없다. .php다음에 ?를 쓴다음 id=1&pw=1'or'1'='1이라고 작성하였다.(작은 따음표는 url인..
SQL Injection이란? SQL Injection은 1998 년에 phrack에 기법이 소개된 이후로 언제나 owasp 상위권을 차지하고 있으며 수많은 웹사이트에서 수많은 개인정보를 유출하는데 사용된, 사용되고있는 기법 SQL Injection을 쓰는 이유 SQL Injection 의 가장 큰 특징은 데이터베이스를 공격한다는 것이다. 여타의 해킹기법은 서버사이드 언어가 작동하는 서버 혹은 서버에서 데이터를 받는 클라이언트를 공격하는 기법이다. 그러나 데이터베이스는 서버사이드 언어와는 구분되어진 한개의 프로그램이다. 데이터베이스 자체에서 SQL Injection 을 방어하는것은 어렵고 비효율적인 작업이기에 개발자는 데이터베이스에 가해지는 공격을 서버사이드에서 방어해야한다. 이것이 SQL Injecti..