의미없는 블로그
Lord of SQL Injection (3, 4, 7, 11, 12, 13번) 본문
#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 |