Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 15, 2014 11:54:40

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

Всем привет!

Продолжаю баловаться с пайтоном и столкнулся с задачей запуска пайтона (который в свою очередь запускает шелл).

Есть кусок html страницы, где 3 поля ввода и одна кнопка.

<form method=POST action="/cgi-bin/copy_schema.py">
        <P><B>Enter schema, you want to copy from:</B>
        <P><input type=text name=user_old>
        <P><B>Enter new schema name:</B>
        <P><input type=text name=user_new>
        <P><B>For creation confurmation, please enter your email address:</B>
        <P><input type=text name=email>
        <P><input type=submit>
        </form>

Ожидается, что из полей получается 3 переменных: user_old, user_new и email

Далее данные передаются в скрипт copy_schema.py:

#!/usr/bin/env python
import cgi
import os
user_old = cgi.FieldStorage()
user_new = cgi.FieldStorage()
email = cgi.FieldSotrage()
doc_yes = """
<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
    <title>The job is done!</title>
  </head>
  <body>
                Copy command sended succesfully. Please wait for email confirmation from server, when schema is ready.
  </body>
</html>
  """
doc_no = """
<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
    <title>Error!</title>
  </head>
  <body>
                Command has not been sent to database. Did you fill all forms?
  </body>
</html>
  """
doc_no_email = """
<html>
  <head>
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
    <title>Error!</title>
  </head>
  <body>
                You didn't fill the "email" form. Command has been sended successfully, but you won't receive email about creation comfurmation.
  </body>
</html>
  """
if 'email' in email:
        if 'user' in user_old:
                if 'user' in user_new:
                        user_new = cgi.escape(user_new['user'].value)
                        user_old = cgi.escape(user_old['user'].value)
                        email = cgi.escape(email['email'].value)
                        os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))
                        print(doc_yes)
                else:
                        print(doc_no)
        else:
                print(doc_no)
else:
        print(doc_no)

Сам скрипт copy_schema.sh выглядит так:

#!/bin/bash -l
sqlplus -S SYSTEM/MANAGER <<<"drop user $2 cascade;"
sqlplus -S SYSTEM/MANAGER <<<"create user $2 identified by $2;"
sqlplus -S SYSTEM/MANAGER <<<"grant connect to $2;"
sqlplus -S SYSTEM/MANAGER <<<"create database link tmp_$$ connect to system identified by manager using 'localhost:1521/orcl';"
impdp system/manager nologfile=Y remap_schema=$1:$2 network_link=TMP_$$ schemas=$1  EXCLUDE=STATISTICS
sqlplus -S SYSTEM/MANAGER <<<"drop database link tmp_$$;"
[[ -n "$3" ]] && /usr/sbin/sendmail $3 <<<"Your export import task from $1 to $2 has been completed!"

Есть вопрос по двум фрагментам:

user_old = cgi.FieldStorage()
user_new = cgi.FieldStorage()
email = cgi.FieldSotrage()

Так правильно получать данные с html странички?

и по этому кусочку:

user_new = cgi.escape(user_new['user'].value)
                        user_old = cgi.escape(user_old['user'].value)
                        email = cgi.escape(email['email'].value)
                        os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))

Правильно ли здесь с точки зрения синтаксиса?

Всем добра!

Офлайн

#2 Сен. 15, 2014 23:24:50

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

thomas
и по этому кусочку:
thomas
os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))

Параметры в кавычки не взял - создал место для инъекции.
import os
 
text = 'Hello.'
os.system('echo {} 1>/dev/null'.format(text))
 
text = '| cat /etc/passwd 1>&2 | echo'
os.system('echo {} 1>/dev/null'.format(text))

Атака классическая, ещё на sendmail её проводил кто-то (Митник, вроде бы). Это когда в обратный адрес добавлялся конвейер, а потом письмо посылалось на несуществующий адрес. Когда сервер возвращал письмо обратно отправителю, команда выполнялась и открывала дыру побольше.



Отредактировано py.user.next (Сен. 15, 2014 23:26:12)

Офлайн

#3 Сен. 23, 2014 09:50:44

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

Спасибо за комментарий! А в остальном с синтаскической точки зрения все ОК? потому что при запуске из браузера ничего не происходит, ожидается веб сервер, а на вебсервере просто идет пайтоновский процесс.

Офлайн

#4 Сен. 23, 2014 10:19:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

thomas
потому что при запуске из браузера ничего не происходит, ожидается веб сервер, а на вебсервере просто идет пайтоновский процесс.
Перед выполнением команды выведи принятые поля, а команду закомментируй пока. Убедись, что всё точно выводит.

thomas
А в остальном с синтаскической точки зрения все ОК?
Трёхэтажную конструкцию лучше переделать в одну одноэтажную, так как ветвь else у них одинаковая. Если же эти ветви разные, то также лучше переделать её в три одноэтажных.



Отредактировано py.user.next (Сен. 23, 2014 10:22:43)

Офлайн

#5 Сен. 25, 2014 15:58:40

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

Я сменил команду на обычный print вводимых переменных, но скрипт по-прежнему висит в ожидании.
То ли лыжи, то ли я чего-то не понимаю.

Офлайн

#6 Сен. 25, 2014 16:08:47

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

Что наблюдательно - при отключении от страницы в лог вылезло следующее:

 File "/opt/oracle/dbscripts/web_dba_lite/cgi-bin/copy_schema.py1", line 9, in <module>
    email = cgi.FieldSotrage()
AttributeError: 'module' object has no attribute 'FieldSotrage'
ktovmasian-ibm.oilspace.net - - [25/Sep/2014 13:07:58] CGI script exit status 0x100

Офлайн

#7 Сен. 25, 2014 16:28:45

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

По этому фрагменту заметил опечатку: Sotrage -> Storage.

но проблему это не решило, браузер по-прежнему висит, но при закрытии страницы в лог ничего не идет.

Офлайн

#8 Сен. 25, 2014 23:06:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

thomas
Я сменил команду на обычный print вводимых переменных

Выведи в странице через print
user_old
user_new
email

Прикрепил пример формы.



Прикреплённый файлы:
attachment cgiform.tar (10,0 KБ)

Офлайн

#9 Сен. 26, 2014 12:00:30

thomas
Зарегистрирован: 2014-07-10
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

py.user.next



Теперь приблизительно стало ясно как работает cgi.FieldStorage()


Я изменил

if 'email' in form:
if 'user_old' in form:
if 'user_new' in form:
print('<p>email:', form['email'].value)
print('<p>user_old:', form['user_old'].value)
print('<p>user)new:',form['user_new'].value)
#user_new = cgi.escape(user_new['user'].value)
#user_old = cgi.escape(user_old['user'].value)
#email = cgi.escape(email['email'].value)
#os.system('copy_schema.sh {0} {1} {2} > dev/null 2>$1'.format(user_old, user_name, email))
#print(doc_yes)
else:
print(doc_no)
else:
print(doc_no)
else:
print(doc_no_email)


Если я одно из полей не забью, он выведет мне сообщение с ошибкой.
Однако, если все поля заполнены, переменные не выводятся. Не подскажите, где ошибка?

Офлайн

#10 Сен. 26, 2014 12:05:12

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10014
Репутация: +  857  -
Профиль   Отправить e-mail  

Продолжаем химичить с python и html

thomas
Однако, если все поля заполнены, переменные не выводятся.
Выведи перед if'ами.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version