orge 문제 풀이

이 문제 같은 경우는 pw를 get 방식으로 가져와서 sql문에 넣고 나중에 비밀번호를 인증 확인할때 db table에서 가져온 pw와 get방식으로 가져온 pw가 일치하는 지를 보고 있다.

즉 pw 입력을 할때 정확한 비밀번호를 대입해야한다. 이건 일전에서 풀었던 orc와 같은 문제이지만 and와 or 이 필터링 되기 때문에 이를 우회하기만 한다면 같은 방식으로 풀 수 있다.

해결 방법을 찾았다 여기서도 hello guest를 출력하기 때문에 해당 문구에 id= 'admin'을 추가하기만 해도 orc와 같은 형식이 된다.

여긴 틀려먹은 생각^^

곰곰히 생각하다가 id= 이라는 문구를 두개 or 방식으로 넣으면어떻게 될지라는 생각이 들어 내가 가진 phpmyadmin에 sql 질의를 아래와 했지만^^  아래와 같이 두개의 테이블이 나올 경우 2번째 열 비교를 못한다.

select * from login where id='1' and pw='1' or id='2' and '2' 로 했더니 아래와 같이 두개의 테이블이 나오게 됐다. 즉 이 문제도 이렇게 하면 앞에 guest가 만족하도록 만들고 뒤에를 admin을 알아내도록 orc 와 같은 방식으로 풀어주는 것이다.

id pw

1   1

2   2

length 부터 시작해서 대입해 보자 확인시 orc와 같게 여기도 8자리이다.

자동화가 필요하다 생각하여 파이썬 코드 작성

아래 코드는 다른 블로그 내용 참고해서 작성하였다.

다만 특이한 점은 특수문자를 인코더하여 보낼 경우 작동을 안하였다. requests 자체에서 인코딩해서 데이터를 보내기 때문에 인코딩한 값이 한번더 인코딩되어 전달되는 것 같다.

import requests

url='https://los.rubiya.kr/chall/orge_bad2f25db233a7542be75844e314e9f3.php'
cookies={'PHPSESSID':'7qs6pdatcldhqr93cjustg1pl7'}
pw_str=''


for position in range(1,9):
    for find_pw in range(33,127):
        value ="x' || id='admin' && ascii(substr(pw,{},1))={}#'".format(position,find_pw)
        parameter={'pw':value}
        res = requests.get(url, params=parameter, cookies=cookies)


        if("Hello admin" in res.text):
            pw_str+=chr(find_pw)
            print("pw=", pw_str)
            break

print("Found all pw=",pw_str)

Clear!!!

wolfman 문제 풀이

preg_match 로 걸어지는 문자

prob  <ㅡ table 이름을 필터링하여 데이터베이스를 확인하지 못하도록 사용한듯하다. query 문에  테이블 이름 prob_darkeif가 있음

_

.

( )

공백

 

생각보다 공백이 막히니 and 와 or을 쓰기가 까다로워 졌다.

그러면 생각해 낸게 id가 admin이기 만 하면 id가 중복될 일은 없을테니 or을 한번만 쓰고 '로만 구분하도록 하는 것이다.

or 다음에 'admin'을 써서 or과 다음 문장의 구분을 만들고 id 뒤에는 #처리를 하여 공백처리 하면 정상적으로 Clear가 가능하다.

darkelf 문제 풀이

필터링 문자

_

.

( )

or

and

우선적으로 검증을 id만으로 검증을 하도록 되어 있다. 어떻게든 id=admin이라는 문구만 넣으면 문제가 풀릴 것이다.

darkelf에서는 연산자를 사용못하도록 해놨다. 그렇다면 어떻게 해야할까?

or, and 와 똑같은 동작을 하는 코드를 찾아내는 것이다. 그것이 바로 아래 설명대로 이다.

|| 는 or 과 같은 역할

&&  and와 같은 역할

만약 위 코드가 작동 안하면 url 로 인코딩해서 집어넣을것

url 인코딩 디코딩 사이트

https://meyerweb.com/eric/tools/dencoder/

[LOS] SQL Injection 풀이 (orc)

어제 못 푼 문제를 다시 풀어본다.

우선 첫번째로 접근해야 할점은 코드를 보면 id가 admin인 것은 고정이고 pw 가 맞으면 admin이라는 문구를 출력하도록 되어 있다.

그리고 새로운 함수 addslashes가 있는데 이 함수는 DB에 저장될 때 '와 같은 특수문자는 구문을 나눌때 사용되므로 오류를 일으킬수 있기 때문에 앞에 / 을 처리하여 특수문자를 문자로 인식해 오류를 줄여주는 코드이다.

여기서는 DB에 저장하는 것이 아닌 참 거짓을 위주로 하는것이기 때문에 크게 신경쓰지 않아도 되는 부분이다.

 

주된 목적은 화면에 참 거짓이 도출된 다는 것이다. 이것을 이용하면 db의 데이터에 계속된 질의를 통해 비밀번호 값을 알아 낼 수 있게 된다.

처음에는 문자열을 길이를 알아내기 위해

Length를 이용하여 길이를 알아낸다.

그러면 아래 그림과 같이 8자리 패스워드인 것을 알아낼 수 있다.

패스워드의 길이를 알아냈으니 다음으로 해야할 것은 바로 비밀번호를 대조해서 넣는 것이다.

그걸 위해서는 substr 과 ascii를 알아야한다.

substr를 이용해 비밀번호를 한자리씩 추출해 참 거짓을 판별하는 것이다. ascii를 사용하는 이유는 대 소를 비교해 주는 <,> 문자를 사용하기 위해서이다. 만약 영어나 특수문자일 경우는 숫자형식으로 변환해서 대소를 구분하기 쉬워져 조금 더 수월하게 비밀번호를 찾는 것이 가능해 진다.

ascii 코드

48 ~ 57 : 숫자 (0 ~ 9)
65 ~ 90 : 영어(대문자) (A ~ Z)
97 ~ 122  : 영어(소문자) (a ~ z)
32 ~ 47 : 특수문자 (space, !, ", #, $, %, & etc.)
58 ~ 64 : 특수문자 (:, ;, <, =, >, @, ?)
123 ~ 126 : 특수문자 ({, |, }, ~)

이제 위 ascii를 이용해 데이터를 추출해 보자 python으로 코드를 짜도 되지만 나 같은 경우는 burp suit을 이용하여 값을 찾아내었다.

아래 문구처럼 url 을 만든다음 burp suit으로 http history로 패킷을 잡아서 intruder로 보낸다.

intruder는 반복하기 어려운 작업을 반복잡을 해주는 역할을 한다.

처음 하는 사람들은 사용법이 어려울 수 있으니 전체샷으로 찍어서 올린다.

맨처음 choose an attack type이 sniper로 되어 있을텐데 아래와 같이 cluster bomb로 설정해준다. 이는 설정한 payload positions을 각기 다른 값을 대입하는 공격 방식이다

payload positions의 보라색 부분이 패턴에 맞게 변경하여 반복 공격을 하는 자리이다. 아래와 같이 설정해준다.

그다음 payloads 탭에 가서 아까 설정한 payload positon의 순서에 맞게 설정해 준다. 비밀번호는 8자리 였기 때문에 substr을 이용해 첫번째 자리 부터 8번째 자리까지 1~8을 집어 넣어줘야한다.

substr(값,추출위치,해당위치의추출갯수) <ㅡ 함수 형식

두번째 payload postion에서는 숫자부터 집어넣기위해 48~57 을 넣는다. 이는 ascii코드로 0부터 9까지를 의미한다.

증가는 1씩

attack을 하면 아래와 같이 창이 뜨고 결과가 뜨게 되는데 참과 거짓의 문자 Length가 다르기 때문에 Length를 기준으로 정렬하면 아래와 같이 나오게 된다. 보게되면 4번 자리만 값이 안뜨는 것을 볼 수 있다. 즉 숫자가 아닌 다른 문자로 되어 있기 때문에 반복으로 위 과정을 영어 ascii 한번더 해주면 된다.

그러면 ascii 97 를 디코더한 소문자 a가 나오게 된다.

ascii에서 10진수로 변환시 095a9852가 나오게 되고 대입시 Clear가 된다.

Lord of SQL Injection 문제 풀이

문제 1번

이 문제는 php문을 주고 어떠한 식으로 필터링해야하는지 고민하는 문제이다. 입력창이 없는 이유는 get 방식으로 url에 데이터를 포함해서 오기때문에 url get 방식으로 전달할 데이터를 붙여주기만 하면된다.

보게되면 if문의 preg_match는 문자의 일치 여부를 반환시키는 것인데 여기서는 매칭시 exit를 썼다 즉 prob, _ , . ,()를 필터링하는 것이다.

' 와 "를사용할 수 있으니 이를 이용하여 우회를 해보자

id = admin

pw = admin' or '1'='1  를 집어 넣으면 id가 틀리더라도 pw 부분은 무조건 참이기 때문에 db의 첫번째를 가져오는데 이번의 경우 admin이 첫번째였다. 만약 첫번째가 아닐 경우 다른 경로로 우회를 해야한다.

문제 2번

문제 1번과 달라진 점이 있다면 md5를 썼다는 것이다. md5는 암호화를 하는 것으로 복호화와 암호화 둘다 가능한 암호 기법이다. 즉 pw를 a를 입력하여 md5가 암호화하면 1234가 된다고 하자 그 이후에 다시 영어 a를 다시 암호화 해도 1234가 된다. 즉 매칭이 변하지 않는 암호화 기법이다. 다만 여기서는 db의 내용을 파악해야 admin 계정 비밀번호를 알 수 있으니

md5를 무시하여 우회를 해보도록 하겠다.

 

pw를 무시하기 위해서는 id를 제외한 나머지 부분을 주석처리해야할 필요성이 있다. 주로 많이 쓰이는 주석을 정리하면

1. #

2. --

3 /*~~@#*/   

4 ;%00   <-- %00는 Null을 뜻하는데 ;와 같이 쓰이면 뒤에 오는 문자를 주석처리함

해당 문제에서는 1,2 번이 안되서 4번을 이용하여 admin 입력 후 pw 부분을 주석처리하여 우회를 하였다.

 

문제 3번

preg_match('/\'|\"|\`/i) <- 보게되면 이제는 '와 "로 필터링하는 것을 볼 수 있다. 이제는 다른 방법으로 우회를 해야한다.

또한 한가지 더 고민해야할 점은 id가 guest로 고정이 되어 있다는 것이다. 우리가 알아야할 것은 admin의 계정이기 때문에 admin을 불러오는 방법에 대해 고려해야한다.

id가 guest이면서 no=1이면 아래와 같이  통과하는 것을 볼 수 있다. 이를 우회할려면 id=guest이면서 no=1인 것을 거짓으로 만들고 뒤에 or 을 붙이면 or 뒤에 no = 2 는 대게 존재하기 때문에 no =2 를 기준으로 값을 찾게 된다.

아래는 그를 이용한 것이고 no = 2 와 no like 2는 거의 같은 것이라 보면된다. = 문자가 필터링 됐을 경우 like 를 사용한다.

문제 4번

특이하게 addslashes가 추가된 부분을 볼 수 있다. addslashes는 '  ~"~"~ ' 와 같이  따옴표 안에 따옴표가 있을때 문자로 인식하지 않게 슬래쉬를 붙여주는 역할을 하는 함수이다.

죽어라 풀었는데 안풀렸다.  가만히 생각해보니 pw 부분이 참이기만 하면 hello admin을 출력해 주니 이를 이용하여 length을 우선 알아내고 그 후 자동화 기법을 통해 비밀번호를 추출해 주면 된다. 이를 위해서는 burp suit의 intruder나 파이썬 코드를 이용하여 작성하면된다.

length()를 이용하여 8자리 비빌번호인것을 파악했다. 다음으로 해야할 것은 자동화 공격이다.

문제 4번 코드는 좀 더 알아본 후 추가하도록 하겠다.

Lab: Web shell upload via extension blacklist bypass 문제 풀이

이번 문제는 Blacklist에 관한 문제이다. Blacklist란 특정 단어만을 필터링하여 입력되지 못하게 하는 것이다. 지금까지는

php파일을 서버에 올려서 올린 파일의 위치를 찾아 실행만 시키면 php가 작동되었다. 이번에는 Blacklist 필터링을 했기 때문에 아마 안올라갈 가능성이 높다.

실제로 아래 php 를 올려보니 확장자명이 필터링되어 승인이 거절되는 것을 볼 수 있었다.

이제 업로드 요청을 burp suit Repeater 보내 확장자명을 우회해 보자 우선 첫번째로 생각해 보면 File upload 문제 3 에서 설명한 것과 같이 php 말고 다양한 확장자명이 존재한다. 이 중 선택적으로 승인하여 받아들이는 것이 가능하기 때문에 여러 확장자 명을 대입해 어떠한 확장자가 승인되는지 확인해봐야한다.

우선 아래 사진에 나온 php 확장자를 대입해 보겠다. 

그 결과 아래 처럼 php를 제외한 거의 모든 확장자가 올라가는 것을 보았다. 이 페이지의 경우 php만 필터링하는 것으로 예상된다.

이 문제의 경우 우회가 너무 쉬웠다.

오늘은 한문제 더 풀어보도록 하겠다.

Lab: Web shell upload via obfuscated file extension 문제풀이

이번 파일의 경우 php를 다이렉트로 파일 업로드를 했지만 아래와 같이 JPG, PNG 파일만 업로드가 가능하다고 되었다. 이 문제도 위와같이 우회를 우선 해보겠다.

모든 우회가 실패하였다. 이번 문제의 경우 png와 jpg의 이름만을 화이트 리스트로 허용하는 것으로 예상된다. 이를 뚫기 위해 파일명을 png를 붙여주돼 서버에 올라갈때는 php라는 파일로 올라가도록 이름을 변경해 보았다.

exploit.php%00.png 여기서 %00는 종단 문자로 뒤에 문자는 무시한다는 의미이다. 이 파일을 서버에 올리면 아래와 같이 성공적으로 올라가는 것을 알 수 있었다.

 업로드한 파일 내용에는 php문구가 포함되어 있기 때문에 실행하면 flag가 나오게 된다.

 

Lab: Web shell upload via path traversal 문제풀이

해당 페이지에 들어가 로그인을 하게 되면 파일 업로드가 가능하다. 이번 문제에서는 이것을 이용하여 웹 쉘을 만들어야 한다.

아래는 파일을 업로드하였을때 발생하는 요청을 확인한 것이다. 내용을 보게되면 이미지 데이터를 읽어와 서버로 보내는 것을 확인할 수 있다.

그리고 내가 업로드한 이미지를 우클릭하여 경로 복사하면 아래 처럼 경로가 files/avatars/cat1.jpg로 나오는 것을 알 수 있다.

https://bb7c0d2448900c3005c.web-security-academy.net/files/avatars/cat1.jpg

이를 이용해 아래와 같이 filenmae과 내용을 system이라는 쉘을 만들어 업로드해 실행시켜보았다.

하지만 화면상으로 보여지기만 하지 실행되지 않았기 때문에 이 경우 첫번째로 생각할 수 있는 경우는 확장자를 지정하여 특성 확장자만 실행되도록 코드가 짜져있기 때문에 이를 위회하기 위해서 모든 종류의 확장자를 대입해 보아야 한다. php의 경우  아래 처럼 여러 확장자가 존재한다.

위 확장자로 다 대입을 하였는데 안되었다. 이 경우 php라는 단어를 자체를 필터링하여 올리는 경우가 존재하기 때문에

phphpp 같은 형식의 확장자로 올려도 보았지만 작동안하는 것은 매한가지 였다.

그래서 생각해 낸게 해당 폴더에서는 읽기만 가능하도록 권한 설정한 것으로 파악하여 다른 경로에 파일을 저장하도록 하였다. 서버가 작동하기 위해서는 php 파일을 무조건 읽어야하기 때문이다.

그래서 파일 이름을 ../name.php 라는 형식으로 적어 해당폴더 전 경로에 name.php를 저장하게 하였다.

그랬더니 아래와 같이 ../써도 name.php라고 적혀있을 것을 볼 수 있다. 다른 위치에 /를 넣으면 자동으로 해당 위치 위로 파일이름을 잘라내는 것 같았다. 이는 인코딩 후 잘라낸다음에 디코딩하는 것으로 예상이 되어 미리 인코딩한 것을 넣고 디코딩시 해당 / 문자를 인식하지 못하도록 하여 잘라내지 못한 상태로 디코딩하여 입력과 똑같이 나오도록하였다.

url에서 / 인코딩은 %2f 이고 아래에 정리를 해놓았다.

%26 &
%2F /
%3A :
%3F ?
%3D =

..%2fname.php 로 하였더니 정상적으로 avatars/../name.php의 경로에 저장되었다. (../)라는 문자는 전 폴더에 저장하라는 위치이니 avatars가 있는 경로에 저장된 것을 확인할 수 있다.

아래와 가이 files라는 경로에서 flag를 찾아내었다.

+ Recent posts