일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 블라인드 인젝션
- 모의해킹
- 스마트폰
- webhacking.kr
- 부동산
- 안드로이드
- 웹해킹
- APKManager
- 투자
- 일기
- 프리다
- jeb
- 서울
- 아파트
- NOX
- Frida
- 부동산분석
- Lord of SQLInjection
- 월세
- SQL INJECTION
- Los
- UnCrackable
- 아파트실거래가
- 매물
- 후킹
- Mid()
- ADB
- 호갱노노
- 전세
- Blind Injection
- Today
- Total
일단 쓰고보자
[los] iron_golem 본문
#문제
#문제 의도
- 입력 값 필터링 규칙 (pw)
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
if(preg_match('/sleep|benchmark/i', $_GET[pw])) exit("HeHe");
1) prob
2) _
3) .
4) ()
5) sleep
6) benchmark
- 목표
필터링을 사용하지 않거나 우회하여 쿼리 결과가 존재하면 해결
#확인사항
- 문제 코드를 잘 보면 여느 블라인드 인젝션과는 다르게 Hello admin, Hello guest 등 쿼리 결과에 따라 참/거짓을 판별할 수 있는 문구를 출력해주지 않아서 다른 방법을 찾아봐야 한다. 우선 의심 드는 부분은
1) Time based SQL Injection
2) Error based SQL Injection (코드 내 mysqli_error 함수 추가된 것으로 추정)
- 먼저 Time based SQL Injection을 시도해보려 했으나 sleep과 benchmark 문자를 필터링한 것으로 보아, 이미 간파당한 것 같다. sleep, benchmark 함수를 잃은 상태에서는 헤비쿼리를 통한 인젝션을 시도해볼 수 있는데, 이 또한 information_schema.columns A, information_schema.columns B, 등 언더바 문자(_)를 필요로 하여 필터링에 걸린다. 여의치가 않다. Time based SQL Injection 땡
- 다음으로 Error based SQL Injection. pw 값으로 싱글쿼터(')만 입력하는 경우 에러가 발생하게 된다.
- 제일 먼저 든 생각은 "조건문을 사용해서 참인 경우 에러를 유발할 수 있는가?" 였다. 여지껏 해본 적은 없었으나 가능하면 상당히 강력한 공격법이 될 수 있을 것만 같다. 행복회로 돌리며 우선 쿼리 기본 틀부터 잡아보았다. 다행히 문자 사용이 꽤나 자유로워서 다행이었다.
※ select id from prob_iron_golem where id='admin' and pw='' or if(조건문, 에러유발, 0)#
- 처음엔 에러유발 부분에 싱글쿼터(') 하나씩만 넣어보거나 char 함수로 싱글쿼터 문자만 넣거나 등등 해봤지만 조건문과 관계없이 에러 나거나 아예 에러가 나지 않았다. 맨 땅에 해딩하는 시간을 가졌다.
- 한 참 찾다보니 서브쿼리는 아래 2가지의 경우 에러가 발생한단 것을 알게되었고, 2번의 경우는 조건과 관계없이 에러가 나서 1번으로 진행했다.
1) 서브쿼리의 결과가 2 rows 이상 ※ ex) select 1 union select 2
2) 서브쿼리의 결과 컬럼이 2개 이상인 경우 ※ ex) select 1, 2
- 이제 Blind Injection 을 시작해보자. pw 길이를 알 수 있도록 기본 쿼리 틀을 수정하여 참과 거짓인 경우를 살펴보면
※ select id from prob_iron_golem where id='admin' and pw='' or if(length(pw)<1000, select 1 union select 2, 0)#
1) 참인 경우
2) 거짓인 경우
- pw 길이는 32란 걸 알게됐다.
- 다음은 각 문자열을 알아내는 쿼리를 만들어 문자를 알아내는 쿼리다.
※ select id from prob_iron_golem where id='admin' and pw='' or if(ascii(mid(pw,1,1))=100, select 1 union select 2, 0)#
- BurpSuite의 Intruder 기능으로 Bruteforcing 수행 결과 PW 값을 알아낼 수 있었다. (사람이 도구를 써야지)
※ 각 문자 알아내는 것처럼 Payload 2개 이상 한 번에 Bruteforcing 할 때 진짜 Intruder Cluster Bomb 추천
- 드디어 풀렸다.
'모의해킹 > Lord of SQLInjection' 카테고리의 다른 글
[los] dragon (0) | 2020.05.11 |
---|---|
[los] xavis (0) | 2020.04.24 |
[los] nightmare (0) | 2020.04.10 |
[los] zombie_assassin (2) | 2020.04.10 |
[los] succubus (0) | 2020.04.08 |