SQL Injection
-
Crackus 8 Write Up (Union SQL Injection)CTF/Web 2020. 4. 16. 18:59
공백 필터링이 되고 있다. 그래서 '|' 기호는 띄어쓰기가 없어도 된다는 점을 이용하여 값을 넣어보았다. pw='||id='admin 딱봐도 DB에 admin이란 id가 없는 것 같다.... 스읍.. 그래서 이럴때 사용 가능한 union select 기법을 사용해보기로 했다. 그렇게되면 공백을 사용하여야하는데 공백은 여러가지 우회방법이 있는데 이번에는 필자가 애용하는 %0a를 사용하여 풀었다. 블로그들을 보니 union select를 이용해서 푼 풀이가 많지 않은 것 같다. 그래서 자세히 적어보려고 한다. union은 기본적으로 병합의 의미를 갖고 있으며 sql에서는 두개의 쿼리를 이어주는 역할을 한다. 고로 필자는 기존 "select id from play_sql08 where pw=''" 쿼리문을 사..
-
Crackus 7 Write Up (Sql injection, bool type, 숫자와 문자는 true일까 false 일까? / '숫자+문자'와 숫자의 비교)CTF/Web 2020. 4. 12. 02:24
이번 문제는 문제 풀이만 하면 쉽게 넘어갈 수 있지만, 자세한 원리까지 오늘 설명해보려고 한다. 코드를 읽어보면 md5('crackus') = $hash라고 되어 있다. crackus를 md5 해쉬 암호화한 값을 넣어주면 문제가 풀린다. 하지만 이렇게 쉽게 풀리도록 출제자는 두지 않았다. 애초에 첫번째 if문에서 아예 못을 박았다. 숫자값이 아니면 강제로 나가진다. ?hash=a 를 입력해보면 이 뜬다. 그래서 우리는 숫자만 입력해야하는데 crackus를 md5 해쉬암호화 하면 알 것이다. https://www.convertstring.com/ko/Hash/MD5 이 링크에서 암호화가 가능한데, 해보면 보면 알겠지만 알파벳이 들어가 있다. 이 값을 그대로 넣으면 분명 Nope이 뜰 것이다. 하지만 문자열..
-
Crackus 6 Write Up (Sql Injection)CTF/Web 2020. 4. 9. 17:22
preg_match를 보면 적어도 내가 아는 주석은 다 막혀있다. 그렇다면 마지막 파라미터인 pw 값을 활용해주어야한다. 현재 sha1('')로 sha1 암호화를 진행하고 있는 것을 볼 수 있다. 그렇다면 pw=')를 하면 어떨까? 어떻게 풀어야 할지 감이 오기 시작할 것이다. 이제 그 뒤에 값을 넣어보면 필자가 무슨말을 하고싶은지 눈치챌것이다. 라는 값을 넣어보았다. pw=sha1('') 후에 입력값을 넣어줄 수 있다. ?pw=')||1=1 을 입력해보면 이렇게 된다. 우리는 주석을 사용할 수 없음으로 1')를 활용해야 할 것 같다. 모양을 맞춰주면 어떨까? 이런식으로 참고로 '1' 과 1을 비교하게 되면 참으로 입력이 된다. 그 이유는 나중에 다루려고 한다.
-
Crackus 5 Write Up (hex값을 이용한 Sql Injection)CTF/Web 2020. 4. 9. 02:34
if문을 보면 id값에 'admin'이 들어가야하는데 preg_match에 'admin'이 필터링 되어 있다. 우리는 이 필터링을 어떻게 우회해야할까? 여러 방법이 있는데 여기선 hex값을 이용한 방법을 한번 살펴보겠다. Hex값을 이용 id 쿼리에 아스키말고 hex값을 넣어 줄수도 있다. 다만 0x라는 표현을 적어주어 16진수인 것을 명시해주어야한다. admin의 헥스값은 0x61646D696E이다. 사용방법은 ?id=0x61646D696E 이다. 여기서 중요한 점은 싱글쿼터로 감싸지면 안된다는 점이다. 그냥 url에 이렇게만 적으면 웹페이지 코드를 보면 싱글쿼터로 감싸져 있는데 이 때문에 헥스값이 텍스트로 들어가버리게 된다. 그러므로 이 쿼리 말고 임의의 새로운 id 파라미터를 조작해주어야한다. #도..
-
Crackus 3 Write Up (Sql Injection and, or 필터링 우회 기법/'&','|')CTF/Web 2020. 4. 3. 20:49
'or' 와 'and'가 필터링 되었다. 이럴때는 연산 기호를 이용해 주면 좋다. 그건 바로 '&'(and)와 '|'(or)이다. 다만 이 연산기호를 사용할 때에는 두번 입력해주어야 한다는 특징이 있다. 이렇게 or을 '||'로 대신하여 사용하였다. 장점이 있다면 이러한 특수문자를 사용하면 띄어쓰기가 필요하지 않다는 것이다. 이 장점은 무시못할 장점으로 다른 문제에서 쓰일 때가 많으니 참고하면 좋다.
-
Crackus 1 WriteUp (Sql Injection)CTF/Web 2020. 4. 2. 02:47
1단계는 심플하다. 막혀있는 구문이 없으므로 자유롭게 우회를 해서 풀어주면 된다. 하지만 1번 문제를 검색해서 오셨다는 것은 이제 막 sql injection 문제를 접하기 시작하신 분들일 것이다. 그런 분들을 위해 간단히 설명하자면 1은 bool 타입에서 true로 사용된다. 그래서 id='' or(||) 1 이라고 하면 거짓 혹은 참 이라는 where 절이 되고 '#' 은 mysql에서 주석 역할을 하여 {and pw=''} 쪽은 주석처리가 된다. 결론적으론 거짓 혹은 참일때 id 값을 가져오라는 쿼리문이 되고 데이터를 읽어올 때 where절에 있는 1이 참임으로 데이터를 가져오게 된다. 그래서 result에 데이터가 실려서 1단계 문제가 풀리게 되는 것이다.
-
LOS 22 - dark_eyes Write up (union select를 이용한 에러 기반 blind sql injection, if문 필터링 우회)CTF/Web 2020. 4. 1. 03:15
이번 문제도 에러 기반의 문제이다. 하지만 저번 문제에서 쓴 if문이 막혀버렸다. 이럴 때는 union select를 사용하면 된다. union select 는 어떤 원리로 이용 할 수 있을까? 우선 기존 union select 를 통한 우회방법을 인지하고서 풀 수 있는 문제이다. 그점은 이번 라업에선 넘어가도록 하겠다. 간단히 짚고 넘어가면 select 1을 하면 필드에 1이 들어간다. 그런데 여기에 union select를 하면 어떻게 될까? 1뒤에 3이 밑에 들어간다. 이걸 어떤식으로 이용하는 걸까? 그건 바로 2줄이라는 특징을 이용하는 것이다. 우선 우리가 푸는 Los 문제는 sql문을 읽고 가져오는 데이터가 1줄이다. 하지만 우리가 2줄의 결과값을 억지로 넣어서 가져오게 한다면 어떻게 될까? ?..