ctfshow ThinkPHP 573

web573


código fuente de vulnerabilidad de inyección thinkphp 3.2.3sql

class IndexController extends Controller {
    
    
    public function index(){
    
    
    $a=M('xxx');  //表名
    $id=I('GET.id');
    $b=$a->find($id);
    var_dump($b);
    }
}

Vamos a depurar para ver por qué la inyección normal no funciona. Los datos en la tabla sql local son los siguientes.
inserte la descripción de la imagen aquí
Entrante ?id=1'
Primero, hay un filtro en la función I, y se llama a la función think_filter,
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
pero no tiene ningún efecto, incluso si coincide, agregue un espacio como máximo.
Haga un seguimiento de la función de búsqueda, procésela en la función de búsqueda _parseOptionsy $optionscontinúe con el seguimiento
inserte la descripción de la imagen aquí

_parseType$optionsDespués del procesamiento, podemos ver que si el
inserte la descripción de la imagen aquí
id en nuestra base de datos es de tipo int, ingresará a la función intval, y otros caracteres se eliminarán directamente para lograr el efecto de filtrado.Si el tipo de id es char, continuará bajar. Después
inserte la descripción de la imagen aquí
de la ejecución , vuelva al seguimiento buildSelectSql seguimiento parseSql en_parseTypefindselect
inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí

Sabemos que el valor de nuestro id está en $options['where'], y siguiendo parseWhere
inserte la descripción de la imagen aquí
finalmente ingresa parseValue.En
inserte la descripción de la imagen aquí
parseValue, vemos la función de escape específica
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
, que se escapa mediante la función addedlashes().

addslashes() 函数会在预定义字符之前添加反斜杠的字符串。
预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL

Entonces, supongamos que el contenido que pasamos es una matriz. ?id[where]=1'
Cuando pasamos una matriz, no ingresará lo siguiente si, de lo $options['where']="1'"contrario, es
$options['where']['id']="1'"

inserte la descripción de la imagen aquí
Vaya hacia abajo de la manera que acaba de hacer _parseOptions. Si somos $options['where']una matriz _parseType, ingresaremos. Como mencionamos anteriormente, la corriente $options['where']="1'"es una cadena, por lo que no ingresaremos este si, por lo que cuando el campo id en la base de datos de destino sea int, podemos omitir el filtrado de intervalos.
inserte la descripción de la imagen aquí
Luego regrese e ingrese el if en parsewhere directamente.El $whereStr = $where;contenido final devuelto es la WHERE 1'inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
declaración sql final ejecutada, de select * from xxx where 1' limit 1modo que nuestras comillas simples se conservan.
inserte la descripción de la imagen aquí
El resto es fácil.
Carga útil: ?id[where]=id=0 union select 1,flag4s,3,4 from flags
el nombre del cronómetro anterior y el nombre de la columna no están escritos en detalle.

Supongo que te gusta

Origin blog.csdn.net/miuzzx/article/details/119424071
Recomendado
Clasificación