Web/LOS 8

[LOS] 문제 7. orge

왜 IE에서 자꾸 교차 사이트 스크립팅 방지 메세지가 뜨는지 몰랐는데, XSS를 사용하도록 설정이 되어있으면 나타나는 오류라고 한다. 그래서 그냥 크롬에서 하기로 했다. 크롬은 아래와 같이 바로바로 URL 인코딩해서 값을 보내줘서 오류 뜨지 않고 되는 것 같더라. 1. && 연산자 사용 시 ?pw=%27 || id=%27admin%27 && length(pw)>10 입력했을 때, 아래와 같이 && 연산자가 출력되지 않는 것을 볼 수 있는데 URL를 살펴보니 &&가 URL 인코딩 되어 전송되지 않았다. URL에 사용되는 일부 특수문자(:, ;, /, =, ?, & 등)를 제외한 문자만 인코딩이 되므로 &&를 %26%26으로 바꿔서 전송해주자. 2. 패스워드 길이 따라서 ?pw=' || id='admin' ..

Web/LOS 2018.10.26

[LOS] 문제 5. wolfman, 스페이스(빈칸) 우회 기법 이용

?pw=1 or id=%27admin%27 No whitespace가 뜨며 해결되지 않는다. if(preg_match('/ /i', $_GET[pw])) exit("No whitespace ~_~"); preg_match 함수를 살펴보면 pw에 띄어쓰기가 사용 불가능하고, 띄어쓰기의 URL 인코딩 값인 %20 역시 사용 불가능하다. 빈칸을 우회하는 방법은 은 여러 가지가 있다고 한다. 빈칸을 우회하는 방법은 Tab : %09 Line Feed(\n) : %0a Carrage Return(\r) : %0d 등등. 따라서 답은 ?pw=%27%09or%09id=%27admin

Web/LOS 2018.10.26

[LOS] 문제 4. orc, 함수 이용하여 패스워드 알아내기

pw=%27 or %271%27=%271 했지만 Hello admin 글자만 나오고 해결되지는 않는다. 이유는 if($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); if문으로 pw 결과 값이 같아야지만, 관리자 계정으로 로그인할 수 있다고 한다. 패스워드를 찾기 위해, 먼저 길이를 알아보자. ?pw=%27 or id=%27admin%27 and length(pw)>%276 해보면 if($result['id']) echo "Hello admin"; 즉 Hello admin 부분이 출력된다면, id가 admin이고, 값이 참일 때, 저 결과 값을 띄운다는 것이다. 즉, 패스워드가 6 이상이다. 라는 것을 알 수 있는 것. 따라서 ?pw=%27..

Web/LOS 2018.10.26

[LOS] 문제 3. goblin, 따옴표 문자 필터링 우회

if(preg_match('/prob|_|\.|\(\)/i', $_GET[no])) exit("No Hack ~_~"); preg_match 함수는 PHP 4, 5, 7에서 사용되는 함수이고, 정규표현식 중 하나로 이 함수는 패턴이 일치하는 검색 결과를 반환한다고 한다. 3번 문제는 이전 문제들과 같이 필터링을 하지만 한 개의 필터가 더 추가되었다. if(preg_match('/\'|\'/i', $_GET[no])) exit("No Quotes ~_~"); 즉 데이터베이스의 접근을 막기 위해 [ ', ", ' ] 이러한 따옴표 문자들을 필터링한다. 먼저 쿼리문을 살펴보면, id='guest'로 잡혀 있고, 우리가 입력할 수 있는 변수는 no이다. ?no=1을 넣었을 때의 화면 값은 우리가 이 문제를 해결..

Web/LOS 2018.10.26

[LOS] 문제 2. cobolt, 주석 URL 인코딩

pw=md5('') PW가 md5로 해서 암호화가 되어 있다. PHP 코드를 잠깐 보자. if($result['id'] == 'admin') solve("cobolt") 즉, 이 경우에는 쿼리에서 id가 admin이면 문제가 풀린다는 뜻이다. ?id=admin'%23 여기서 %23은 #(주석)의 아스키 코드의 인코딩 값으로 pw=md5('')를 무효화시켜주기 위해 반드시 필요하다. 만약 %23 대신 #(주석)을 넣으면 문제가 풀리지 않는데, ex) ?id=admin'# ( X ) 문자를 인코딩해서 넣어주어야하는 이유는 # 주석과 같은 것들은 URL 상에서 다양한 문제점을 일으킬 수 있기 때문에 반드시 URL 인코딩된 값을 넣어주어야 한다. 오라클 기반의 주석 처리는 #, MYSQL은 -이며, 또한 URL..

Web/LOS 2018.10.26

[LOS] 문제 1. gremlin, URL 인자로 넘겨주는 GET 방식

1번 문제를 보면 PHP 파일 소스를 보여주는데 우리는 이것을 이용해서 SQL Injection 공격을 해야 한다. 왜냐하면 이 PHP 페이지는 PHP 코드로 데이터베이스와 연동시켜주는 페이지이기 때문이다. ( 페이지가 실행되면, SQL 구문을 실행시켜주는 ) 근데 웹은 HTTP 프로토콜로 통신되고, 로그인할 때, ID와 PW는 URL 인자로 넘겨주는 GET 방식을 이용하기 때문에 우리는 URL 뒤에 ?id=a&pw=b 이런 식으로 인자를 넣어주어야한다. 위는 URL 뒤에 ?id=test&pw=test를 넣었을 때다. 즉 PHP 쿼리문을 보면서, URL에 SQL 구문을 넣어주면 된다. 따라서 ?id=a&pw='' or '1'='1' ?id=haha' or '1'='1'%23 역시 가능하다.

Web/LOS 2018.10.26

SQL Injection 개념

SQL Injection 관련 문제 풀이를 하기 전, SQL Injection에 관한 개념을 먼저 알아보기로 했다. SQL Injection이란 말 그대로 SQL 삽입. 즉 코드 인젝션의 한 기법으로 클라이언트의 입력 값을 조작하여 서버의 데이터베이스를 공격할 수 있는 공격 방식을 말한다. 주로 사용자가 입력한 데이터를 제대로 필터링, 이스케이핑하지 못했을 경우에 발생한다. 공격이 쉬운데 비해 파괴력이 어마어마하기 때문에 시큐어 코딩을 하는 개발자라면 가장 먼저 배우게 되는 내용이다. 로그인 폼에 아이디와 비밀번호를 입력하면 입력한 값이 서버로 넘억가고, 데이터베이스를 조회하여 정보가 있다면 로그인에 성공하게 된다. 이 때 데이터베이스 값을 조회하기 위해 사용되는 언어를 SQL이라고 하며, 다음과 같이 ..

Web/LOS 2018.10.26