Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

의미없는 블로그

Lord of SQL Injection (3, 4, 7, 11, 12, 13번) 본문

# 나/pentest (WEB)

Lord of SQL Injection (3, 4, 7, 11, 12, 13번)

SaltLee 2019. 7. 2. 18:03

 

https://los.eagle-jump.org/

 

 

#3번 -----------------------------------------------------------------------------------------------------------

 

$result['id'] == 'admin' 일때 solve("goblin") 이니깐 id 값이 admin 이 돼야 풀린다

근데 지금 id='guest' 로 박혀있음

입력 가능한 파라미터는 no 밖에 없음 {$_GET[no]}

 

일단 no=1 해보면 Hello guest 뜨는데

그 말은 DB 테이블에 아래와 같이 저장되어 있다는 뜻이다~

  id no
1 guest 1
2 admin ?

 

 

no=1 하면 당연히 거짓이니까 아무것도 안뜨고

no=0 or no=0 하면

앞에 [id='guest' and no=0] 은 거짓이고 [no=0] 이 남은 조건이 되는데 얘도 아무것도 안뜬다

[no=0] 도 거짓이라는 것~~ 

즉 no 가 0 인 계정은 없다는 것~

 

 

id 를 admin 으로 만들어 주면 끝나니까

no=0 or id='admin' 을 입력시도했는데 [id='guest' and no=0 or id='admin'

싱글쿼터(') 가 막혀있다~

 

 

싱글쿼터 못쓸 땐 아스키코드 이용해서 

id=char(97,100,109,105,110) 하면 id='admin' 이랑 똑같아서 풀린다~

 

 

근데 이렇게 푸는 방법 말고

왜 저자가 no 파라미터를 두었을까를 생각해서 no 를 이용해서 풀어보면

0 은 아무것도 없었고 1 은 guest 면

1 이상의 어떤 수가 admin 이라는 거니까

no=0 or no>1 해주면 admin 을 가리키는게 되지...

 

하지만 이것도 DB 테이블에 guest, admin 만 존재한다는 가정 하에 가능하다

아래처럼 다른 계정도 존재한다면 no>1 만으로는 admin 이 안걸러지겠지..

  id no
1 guest 1
2 test 1 이상의 어떤 수
3 admin 1 이상의 어떤 수

 

 

#4번(orc) -------------------------------------------------------------------------------------------------------------

 

result(pw) && (result(pw)) == get(pw)) 이게 정확한 pw 를 찾으라는 조건이라고 함

쿼리에 보면 id='admin' 이므로 admin 의 정확한 pw 를 찾아야 한다

 

일단 pw 파라미터를 GET 으로 받고 있으니깐 pw 파라미터 생성해서 참인 쿼리 만들면 [pw=1' or 1=1#]

Hello admin 이라고 출력된다

 

보라색 쿼리는 거짓이고 파란색 쿼리는 참인데

or 로 되어있으니깐 어쨌든 결과는 참이므로..

 

pw 길이 확인하기 위해 length 함수 쓰면 8자리인것 알 수 있는데

참 쿼리 [id='admin' and length(pw)='8'] 부분에서 그냥 [length(pw)='8'] 이렇게 해줘도 참으로 나오긴 하는데

그러면 어떤 id 의 pw 인지 몰라서 정확한 pw 를 알 수 없다

- Mysql : length

- Mssql : len
- Oracle : length

 

길이 알았으면 substring 함수 써서 한글자씩 찾아내면 된다

- Mysql : substring

- Mssql : substring

- Oracle : substr

 

blindsql1.py

- for i in range(1, 9) : pw 8자리이므로 1~9 까지

- for j in range(48, 122) : 대입할 아스키코드 값, 48(0)~122(z), 0~9/대소문자/특수문자 모두 포함한 범위

- headers=head : 로그인 필요한 사이트이므로 쿠키값 넣어준다

- verify=False : https 사이트일땐 넣어줘야 오류 안남

- str(i) : 1, 2, 3, 4, 5, 6, 7, 8

- chr(j) : 0(48), 1(49), 2(50), ..... y(121), z(122)

 

결과가 295Dd5844 로 나오는데

DB 에서 대소문자 구분 안해서 그런건지 무튼 답은 295d5844 이다~

 

pw=295d5844 넣으면 Clear 된다

 

 

#7번(orge) -----------------------------------------------------------------------------------------------------------

 

result(pw) && (result(pw)) == get(pw)) 이게 있으니 정확한 pw 값 찾으라는 거고

쿼리에 보면 id='admin' 이므로 admin 의 정확한 pw 를 찾아야 한다

근데 입력 쿼리는 id='guest' 로 되어있다

 

id='guest' 를 부정하고 id='admin' 으로 만들어서 pw 를 찾으면 됨

그리고 preg_match 함수로 or, and 를 막고 있어서 다른거 써야 됨

- or : ||

- and : &&

 

or 은 || 쓰고 and 는 && 써서 쿼리 만들면 되는데

&& 같은 경우는 URL 에서 파라미터 구분할때 쓰이므로 그냥 쓰면 인식 못한다 

URL 인코딩해서 %26%26 으로 써줘야됨

 

admin 계정의 pw 길이는 8자리로 확인 가능

 

pw 첫글자는 6 이다

 

blindsql2.py

 

admin 의 pw 는 6c864dec 이다(대소문자 중복 제거)

 

 

#11번(golem) --------------------------------------------------------------------------------------------------------

 

or, and, = 을 못쓰게 해놨다

- or : ||

- and : &&

- = : like

 

= 이 like 로 바뀐거 말고는

7번(orge) 와 똑같다

 

blindsql3.py

 

admin 의 pw 는 88e3137f

 

 

#12번(darkknight) ---------------------------------------------------------------------------------------------------

 

얘도 답은 admin 의 pw 를 입력해야 하는건데

' 입력 안되고 substr, ascii, = 도 입력 막아놨다

- admin : char(97,100,109,105,110) → id='admin' 해야되는데 ' 입력 불가하니깐 아스키코드로 표현한다 

- substr : mid

- = : like

 

근데 패스워드에 숫자 말고 문자도 있을 수 있으니깐

그냥 [mid(pw,1,1) like 1] 하지 않고 [mid(pw,1,1) like char(49)] 로 char 함수 써서 아스키코드로 해줘야 한다

왜냐하면 문자는 'a' 이렇게 ' 써야하니깐 ' 안쓰려면 char 함수 쓴다

 

blindsql4.py

 

_ 는 왜 나온건지 모르겠는데 무튼 중복 대소문자 제거하면 pw=1c62ba6f

 

 

#13번(bugbear) ------------------------------------------------------------------------------------------------------

 

거의 대부분 필터링 하고 있고
= 을 like 로 바꿔도 like 까지 필터링 하고 있다

 

like 대신 in 을 쓰면 되는데 in 은 다음에 괄호를 꼭 써줘야 인식된다
id in ('admin')

id in ("admin")

id in (8)

 

- or : ||

- and : &&(%26%26)

- admin : char(97,100,109,105,110)

- like : in

- 공백 : %09, %0a, %0b, %0c, %0d, %a0, /**/, () 등

 

12번과 마찬가지로 패스워드에 문자가 있을 수도 있으니까

문자가 있으면 ' 가 필요하므로
그냥 [mid(pw,1,1) in (7)] 하지 않고 char 함수 써서 mid(pw,1,1) in (char(55)) 한다

 

blindsql5.py

 

pw=735c2773

'# 나 > pentest (WEB)' 카테고리의 다른 글

webhacking.kr  (0) 2019.07.09
Lord of SQL Injection (15, 16, 17, 18번)  (0) 2019.07.03
Snort 탐지패턴 작성  (0) 2019.06.27
그 밖의 모듬구이  (1) 2019.06.12
Part 04. 정보보호 일반  (0) 2019.05.22
Comments