mail header injection문제이다. ie의 개발자도구를 이용해 html 소스부터 확인해 보았는데 역시나 index.phps가 주석처리 되어있다.

php소스를 보기전에 Mail : 창에 oiehso0을 입력하고 request를 보니 post형태로 email변수에 담겨 서버로 전달 된것을 볼 수 있었다.




php소스를 보니  email에 담긴 값이 header에 From 즉, 발신자로 들어가는 것을 알 수 있다.

바로 아랫줄에 mail함수가 실행되는데  mail(수신자, 제목, 내용, 옵션)이러한 구성으로 이루어져 있다.

내용에는 password가 담기는데 어떻게하면 나도 그 내용을 볼 수 있을까?



mail함수의 레퍼런스를 찾아보던중 예시를 하나 발견했는데 Cc(참조인)이라는 헤더의 옵션을 발견했다.

참조인은 메일을 수신자에게 보내는데 너도 참고해라 라는 의미로 쓰이며 같은 내용이 참조인에게 전송된다.

즉, header injection에 참조인의 옵션이 들어가면 될 것이다.



웹페이지의 입력창에서는 공백과 \n \r 등의 문자를 그대로 헤더 변수에 넣을 수 있는 프록시툴을 이용해서 request를 보내기전 중간에 수정해주는 방법을 이용한다.


'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 26번  (0) 2018.04.12
Webhacking.kr 27번  (0) 2018.04.12
Webhacking.kr 25번  (0) 2018.04.11
Webhacking.kr 18번  (0) 2018.04.11
Webhacking.kr 39번  (0) 2018.04.10


25번 문제는 get방식의 파라미터에 file이름을 넣으면 파일 내용이 출력되는 구조를 갖는듯하다. 그런데 확장자는 생략하고 적어도 상관없이 값이 출력된는 것으로 보이는데 




file에 정말 이상한 값을 넣어도 hello world가 출력되었고, 조건문 마지막 else문 쯤에 hello.txt의 출력 기능이 있을것이라 예상했다.



리눅스 ls -l 명령어를 입력했을때 나오는 화면을 힌트라고 던져준 듯하다.




그렇다고해서 password.php라는 파일을 읽고싶어 hello와 마찬가지로 확장자를 떼고 썼을때도 마지막 else문으로 빠지는 것을 알 수 있었고,

파일명 + .txt <<==와 같이 확장자를 임의로 붙여주는듯 했다. 그래서 문자열의 마지막을 뜻하는 %00(Null)값을 읽고자하는 파일의 마지막에 붙여주니

뒤에 임의로 붙여준 .txt는 무시되고 파일을 읽을 수 있었다.




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 27번  (0) 2018.04.12
Webhacking.kr 47번  (0) 2018.04.11
Webhacking.kr 18번  (0) 2018.04.11
Webhacking.kr 39번  (0) 2018.04.10
Webhacking.kr 01번  (0) 2018.04.10


18번 문제는 sql injection문제이다 lord of sql injection을 클리어 했으니까 무난하게 풀렸으면.. 좋겠다.

먼저 쿼리를 입력해서 전송하는 칸이 따로 있는데 문자열로 들어가기 때문에 url encoding string을 넣어봤자 그대로 들어가지 않는다는 것을 주의한다.

index.phps코드부터 보기로 한다.



숫자만 있는 문자열을 찾을 경우 : "^[0-9]$" : 0~9까지 숫자만있는 문자열

숫자를 제외한 문자열을 찾을 경우 : "[^0-9]" : 0~9까지 숫자를 제외한 문자열


공백  (   )   탭   |   &   union   select   from   0x  <<<===문자를 필터링하기때문에 우회하는 방법을 생각해보면 LF기호인 %0a를 이용하기로 한다.


*참고) sql 연산자 우선순위 : 괄호 > not > and > or


select id from challenge18_table where id='guest' and no=$_GET와 같은 쿼리를 날렸을때 admin이 나와야한다.

아래 세가지와 같은 방법으로 문제를 해결할 수 있다.


0 or 1 limit 1,1

0 or no>1

0 or no=2




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 47번  (0) 2018.04.11
Webhacking.kr 25번  (0) 2018.04.11
Webhacking.kr 39번  (0) 2018.04.10
Webhacking.kr 01번  (0) 2018.04.10
Webhacking.kr 06번  (0) 2018.04.10


해당 문제의 소스를 보면 <!-- index.phps -->와 같은 주석 부분이 있다. 

php소스코드를 확인해보면 str_replace()로 id 문자열에 \\나 ' 에  해당되는 문자를 각각 공백과 ''로 치환한다.

그리고 select 'good' from zmail_member where id='$_POST[id]" 쿼리문을 자세히 보면 맨 뒤에 싱글 쿼터가 하나 빠진것을 볼 수 있다.

POST[id]를 맨 앞 첫부터 15만큼 때오는데     q[0]=='good'을 충족해야한다.




입력창에 15글자인 good + 공백*10 + '(싱글쿼터) 를 넣으면 id가 str_replace("'", "''", $_POST[id])로 인해 16자리가 되지만 substr함수에 의해 맨뒤 싱글쿼터가 하나 잘려나가고 나머지 하나만 남아서 q[0] == 'good'이 True가 되면서 39번 문제 solve. 




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 47번  (0) 2018.04.11
Webhacking.kr 25번  (0) 2018.04.11
Webhacking.kr 18번  (0) 2018.04.11
Webhacking.kr 01번  (0) 2018.04.10
Webhacking.kr 06번  (0) 2018.04.10


php 코드중에 조건문 if를 이해하는지에 관한 문제이다. 그러기 위해선 먼저  eregi가 무슨 역할을 하는지 부터 알아야한다.

eregi는 대소문자 구분없이 대상 문자열에 찾는 문자열이 있는지 없는지 알아보기 위한 함수이다.


숫자만 있는 문자열을 찾을 경우 : "^[0-9]$" : 0~9까지 숫자만있는 문자열

숫자를 제외한 문자열을 찾을 경우 : "[^0-9]" : 0~9까지 숫자를 제외한 문자열


즉. Cookie에 user_lv에는 오로지 숫자만 들어가야하며 5<user_lv<6의 조건을 가져야한다.




'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 47번  (0) 2018.04.11
Webhacking.kr 25번  (0) 2018.04.11
Webhacking.kr 18번  (0) 2018.04.11
Webhacking.kr 39번  (0) 2018.04.10
Webhacking.kr 06번  (0) 2018.04.10



6번 문제 index.phps를 확인해보면 Cookie user에 아무값도 없다면 id와 password에 각각 'guest' , '123qwe'를 넣고 base64암호화를 20번한 뒤에 그 문자열에 들어간 1~8까지의 숫자를 기호로 치환한다.

우리는 decode_id와 decode_pw를 admin으로 맞춰 주었을때 6번 문제를 풀 수 있다. 그러기 위해선

문자열 'admin' 를 base64 암호화를 20번하고 1~8을 기호로 치환해서 cookie에 담아서 request를 보내면 solve.



base64.encodestring()를 사용하는 바람에 엄청난 삽질을 했다.

base64 모듈의 encodestring() 의 API문서를 확인해보니 

Encode the string s, which can contain arbitrary binary data, and return a string containing one or more lines of base64-encoded data. 

encodestring() returns a string containing one or more lines of base64-encoded data always including an extra trailing newline ('\n').

문자열이 길어지게 되면 \n 개행문자를 포함하는것이다.


그래서 base64.encodestring()대신에 base64.b64encode()를 사용하여 간단한 스크립트를 짰다.


proxy tool인 paros를 이용하여 request 쿠키값을 변경한뒤 보내줘도 되지만 좀 더 깔끔하게 스크립트로 해결한다.




web_06.py

'Web Hacking > Webhacking.kr' 카테고리의 다른 글

Webhacking.kr 47번  (0) 2018.04.11
Webhacking.kr 25번  (0) 2018.04.11
Webhacking.kr 18번  (0) 2018.04.11
Webhacking.kr 39번  (0) 2018.04.10
Webhacking.kr 01번  (0) 2018.04.10

+ Recent posts