일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- promise메서드
- 도그존
- 비동기배열
- promise처리
- 지보싶 신촌점
- 비동기배열처리방법
- graphql react native
- graphql with reactnative
- graphql mutation error
- 앙버터마카롱
- graphql with RN
- 예쁜술집 예술
- 금별맥주
- 화이트 해커를 위한 웹 해킹의 기술
- graphql 400
- 화이트해커를 위한 웹 해킹의 기술
- 홍대 카페 장쌤
- apollo react native
- typescript
- 고르드
- 신촌 소문난집
- useMutation error
- 홍대 토라비
- 운정 소바동
- 홍대 예술
- graphql
- 잠실새내 도그존
- apolloclient
- 잠실새내
- 토라비
- Today
- Total
yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆
Command injection 공격 실습 본문
실습 환경: DVWA-Command injection, kali 리눅스
Command injection 공격 실습
다음과 같은 페이지에서 실습을 한다!
입력창에 IP 주소를 입력하면 해당 IP 주소로 ping 명령어를 실행한 후 그 결과를 출력해주는 페이지다.
한번 127.0.0.1을 입력하고 결과를 확인해보자 (127.0.0.1은 local IP 주소)
다음과 같이 ping 명령어를 실행한 결과가 출력된다.
view source를 눌러 해당 페이지의 소스코드를 보자
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ]; //입력받은 IP주소가 target에 저장
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target ); //target을 포함해 시스템 명령어를 내림
//ex) ping 127.0.0.1 로 시스템 명령어 실행
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target ); //target을 포함해 시스템 명령어를 내림
//ex) ping -c 4 127.0.0.1 로 시스템 명령어 실행
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
우리가 입력한 IP주소를 시스템 명령어의 일부로 포함해서 전달하는 것을 볼 수 있다.
우리는 리눅스이기 때문에 ping -c 4 127.0.0.1로 전달되어 실행되고 그 결과를 출력해준다.
그런데 시스템 명령어를 전달할 때 변수 target에 대한 검증과정이 없기 때문에 우리가 추가적으로 실행되길 원하는 명령어를 넣을 수 있다. 그렇게 되면 ping 명령어와 함께 실행된다!
우선 리눅스 터미널에서 ping 명령어와 ls 명령어를 ;를 사용해 한번에 실행되게 해보자
리눅스에서는 ; 을 사용하고 윈도우에서는 &&를 사용한다.
(일종의 테스트라고 생각하면 될 듯, php코드에서도 shell_exec를 이용해 시스템 상에서 실행하기 때문에 그 환경을 재현? 하는 듯)
두가지 방식으로 입력해 보았는데,
1번째는 IP 주소를 정확히 입력한 ping 명령어와 ls 명령어를 한번에 전달했고, ping의 결과 이후 ls의 결과가 출력되는 것을 볼 수 있다.
2번째는 IP 주소를 입력하지 않은 ping 명령어와 ls 명령어를 전달한 것인데 (입력창에 바로 ;ls 를 입력한 것과 같은 효과) ping의 경우 IP주소가 없어 실행에 실패했지만 그와 상관없이 ls는 실행되었다.
즉, IP주소가 틀리거나 입력되지 않아도 ;로 묶여 전달된 다른 명령어는 잘 실행되어 결과가 나온다는 뜻!
한번 DVWA에서 두가지 경우 다 실행해보겠음!!
ls의 결과는 잘 실행된다!
사실 ping의 결과는 우리가 원하는 결과가 아니기 때문에 이제 IP주소는 입력하지 않을 것임
이제 호스트의 사용자 목록을 확인해보자 (;cat /etc/passwd passwd 파일 확인)
이렇게 사용자 목록이 출력되었다.
우리가 command injection 공격을 하면서 시스템 명령어를 실행하기 때문에 해당 사용자가 가지고 있는 권한에 따라 실행할 수 있는 명령어가 있고 실행할 수 없는 명령어가 있다.
사용자 권한을 확인하기 위해 사용하는 명령어로는 id 가 있다.
현재 명령어는 www-data 사용자 권한으로 실행되고 있다. (www-data에게 허용된 권한의 명령어만 사용할 수 있다.)
예를 들어 위에서 ls 명령어를 통해 얻은 파일 중 source 파일을 열려고 시도하면 (;cat source)
ping에 IP주소를 입력하지 않아 결과가 출력되지 않았던 것 처럼 cat source의 결과가 출력되지 않는다.
이 말은 www-data 권한이 source 파일을 열기에는 부족하다는 뜻이다.
그렇기 때문에 공격자는 대부분 root 권한을 얻길 원한다.
그래서 여기서 추가적으로 '권한 상승(privilege escalation) 공격'을 시도한다.
'웹 > 웹 해킹' 카테고리의 다른 글
Stored XSS 공격 실습 (0) | 2020.10.08 |
---|---|
Reflected XSS 공격 실습 (0) | 2020.10.04 |
SQL injection 실습3 (Blind) (0) | 2020.09.30 |
SQL injection 실습2 (ORDER BY & UNION) (0) | 2020.09.30 |
SQL injection 실습1 (WHERE 구문 우회) (0) | 2020.09.29 |