首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python请求;登录到DVWA

Python请求;登录到DVWA
EN

Stack Overflow用户
提问于 2018-07-17 12:22:56
回答 3查看 1.3K关注 0票数 1

我试图登录到该死的易受攻击的Web应用程序,因为我试图编写我的第一个漏洞。但是,第一个障碍是登录页面。如果没有有效的登录,我就无法访问其他目录。

我试图分析哪些标题等,我必须发送,但我仍然无法使登录工作。

代码语言:javascript
复制
POST /dvwa/login.php HTTP/1.1
Host: 192.168.26.129
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://192.168.26.129/dvwa/login.php
Cookie: security=high; PHPSESSID=c4bb8820be21ea83e6545eff0a2cb53b
Connection: close
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Content-Length: 44

username=admin&password=password&Login=Login

当我尝试使用浏览器登录时,这就是从burp发出的全部请求。

代码语言:javascript
复制
import requests

payload = {
    'username': 'admin',
    'password': 'password',
    'Login': 'Login'
}

headers = {
    'Host': '192.168.26.129',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0',
    'Accept-Language': 'en-US,en;q=0.5',
    'Referer': 'http://192.168.26.129/dvwa/login.php',
    'Connection': 'close',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Content-Length': '44'
}

cookies = dict(security='high', PHPSESSID='c4bb8820be21ea83e6545eff0a2cb53b')

with requests.Session() as c:
    p = c.post('http://192.168.26.129/dvwa/login.php', headers=headers, data=payload, cookies=cookies)
    print(p)
    r = c.get('http://192.168.26.129/dvwa/vulnerabilities/exec')
    print(r.text)

这就是我试图使用python请求登录的方式。我得到200 OK两次,但它总是返回登录屏幕的HTML代码。

有人能告诉我我的错误是什么吗?

EN

回答 3

Stack Overflow用户

发布于 2018-07-17 14:50:09

如果您有有效的cookie,可以将它们添加到会话中,

代码语言:javascript
复制
cookies = dict(security='high', PHPSESSID='o9m7jgcspe02h9rffj9g7cv0t5')

with requests.Session() as c:
    c.cookies.update(cookies)

现在您可以访问/dvwa/vulnerabilities/exec了。

如果您没有cookie,那么您可以使用登录页面获取它们。

在登录表单中,必须提交的隐藏输入字段中有令牌。您可以使用bs4re获得它的值。

代码语言:javascript
复制
import requests
import re


payload = {
    'username': 'admin',
    'password': 'password',
    'Login': 'Login'
}

with requests.Session() as c:
    r = c.get('http://127.0.0.1/dvwa/login.php')
    token = re.search("user_token'\s*value='(.*?)'", r.text).group(1)
    payload['user_token'] = token

    p = c.post('http://127.0.0.1/dvwa/login.php', data=payload)
    r = c.get('http://127.0.0.1/dvwa/vulnerabilities/exec')
    print(r.text)

我之所以使用re,是因为它是一个标准库,但最好使用bs4进行html解析。如果安装了bs4,可以使用以下选择器获得令牌:'input[name=user_token]'

票数 2
EN

Stack Overflow用户

发布于 2022-05-23 15:08:44

使用docker时,请确保首先创建数据库。

票数 0
EN

Stack Overflow用户

发布于 2022-08-30 18:35:51

我刚刚经历过这件事(我实际上是用Ansible做的,但是步骤是一样的)。当您第一次访问login.php时,它将在正文文本中为您提供一个user_token (如前所述),以及2个cookie值、PHPSESSID和安全性。您需要提交所有这些来登录。然后,您可以在后续请求中继续使用cookie值。

这些步骤是:

  1. 获取请求/DVWA/login.php
  2. 获取如上所述的user_token
  3. 去拿饼干的价值。
  4. 创建一个标头,将"Cookie“设置为刚获得的值。
  5. 使用包含用户名、密码、Login=Login、user_token和Cookie标题的正文发布请求。(这是重要的一点,您必须使用从登录页面的第一次访问中获得的cookie )。
  6. 检查返回的内容包含文本“欢迎访问该死的易受攻击的Web应用程序”,以确保您得到了正确的并且没有返回到登录页面。

以上答案之间的主要区别在于,您需要这样做:

代码语言:javascript
复制
p = c.post('http://127.0.0.1/dvwa/login.php', cookies=cookies, data=payload)

这里有一个python解决方案:

代码语言:javascript
复制
import requests
dvwa_ip = "192.168.1.86"
resp = requests.get(f"http://{dvwa_ip}/DVWA/login.php")
print(resp.text)

# Get the session id from cookies
phpsessid = resp.cookies.get('PHPSESSID')

# Find the html containing user_token in the page text
user_token_html = [x for x in resp.text.split('\n') if 'user_token' in x]
user_token = [x for x in user_token_html[0].split(' ') if 'value' in x]
# user_token is now ["value='2fc5744b8190bae45673e6b91b825178'"], get value using exec
value=''
exec(user_token[0])

# manually set security low as this defaults to impossible
cookies_json = {
    'PHPSESSID': phpsessid,
    'security': 'low'
}
body = {
    'username': 'admin',
    'password': 'password',
    'Login': 'Login',
    'user_token': value
}

post_resp = requests.post(f"http://{dvwa_ip}/DVWA/login.php", data=body, cookies=cookies_json)
print(post_resp.text) # prints out the "logged in" page (actually index.php)
print("OK") if "Welcome to Damn Vulnerable Web Application" in post_resp.text else print("ERROR")

为了完整起见,这里是我的不可接受的解决方案:

代码语言:javascript
复制
- name: "Browse to DVWA login screen to get the user_token from the content and the cookies"
  uri:
    url: "http://{{dvwa_ip}}/DVWA/login.php"
    return_content: yes
    method: GET
  register: login_form

# Get the user_token from the page content - ugly but works
- set_fact:
    user_token: "{{ login_form.content.split(\"name='user_token'\")[1].split('/>')[0].split('=')[1].replace(\"'\",'').replace(' ','') }}"

- name: Show user_token
  debug:
    var: user_token

- name: "Login to DVWA {{ dvwa_ip }} using the username, password, Login, user_token and the Cookie"
  uri:
    # index.php will redirect to login.php
    url: "http://{{dvwa_ip}}/DVWA/login.php"
    return_content: yes
    follow_redirects: all
    method: POST
    body_format: form-urlencoded
    body:
      username: admin
      password: password
      Login: Login
      user_token: "{{ user_token }}"
    headers:
      Cookie: "{{ login_form.cookies_string }}"
    status_code: [ 200, 302 ]
  register: login
  failed_when: "'Welcome to Damn Vulnerable Web Application!' is not in login.content"

- name: "Do SQL Injection"
  command: "sqlmap -u \"http://{{ dvwa_ip }}/DVWA/vulnerabilities/sqli_blind/?id=2&Submit=Submit#\" --cookie=\"{{ login_form.cookies_string }}\" --dbs --batch --flush-session"
  ignore_errors: true
  register: sqlmap_output
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51381302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档