N0rth3ty's Blog.

XSSbot从入门到放弃

字数统计: 904阅读时长: 4 min
2018/10/01 Share

出题真难

刚开始的时候是从简单的题目开始出吧,那就先XSS吧,这么简单。
然后发现,出题真难。

XSS出题入门

  • 一开始想的是出一个反射型的xss,想得很简单
  • 用js重写alert函数,然后把js加密即可。
  • js解密太容易,而且直接控制台alert(1)简直太容易。
  • 无奈要写一个后端验证,所以学selenium
  • 然后是浏览器内核的选择,chromdriver直接ban掉了反射型的xss,很难受,网上的代码基本全是java,更难受,找了半天终于实现了firefox。
  • 然后问题又来了,一开始写的xss是用的php,现在selenium是用python的,而且一堆依赖,而题目是跑在docker里的,怎么用docker里的php调用外部的python脚本呢,问题很大。
  • 而且这里是写个接口,不能用数据库,意思submit的要一直作为参数传递并最后返回结果,中间会有两次传递。
  • 所以怎么解决呢,直接写python web啊,可是我不会啊,那怎么办啊,学!
  • 所以去学了web.py轻量级的框架,几经周折,终于搞定了最简单的反射型xss。
  • 其中遇到的各种疑难杂症不再赘述,真的恶心。
  • 出题真难

CentOS无桌面环境部署Selenium+Firefox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yum install xorg-x11-server-Xvfb bzip gtk3
cd /usr/local
wget https://ftp.mozilla.org/pub/firefox/releases/56.0.2/linux-x86_64/en-US/firefox-56.0.2.tar.bz2
tar xjvf firefox-56.0.2.tar.bz2
rm -f /usr/bin/firefox
ln -s /usr/local/firefox/firefox /usr/bin/firefox
wget   https://files.pythonhosted.org/packages/14/d6/650f5d2e149b83cd24989653efedf47a24cafb72e9d2dd03191a9f52f2f4/selenium-3.8.1-py2.py3-none-any.whl
pip uninstall selenium
pip install selenium-3.8.1-py2.py3-none-any.whl
yum install gtk3
yum install gtk2
cd /usr/local/bin
wget https://github.com/mozilla/geckodriver/releases/download/v0.19.1/geckodriver-v0.19.1-linux64.tar.gz
tar xvzf geckodriver-*.tar.gz
rm -f /usr/bin/geckodriver
ln -s /usr/local/geckodriver /usr/bin/geckodriver

XSSbot

xss的题目后台都是有一个bot在反复访问提交上来的页面的
这里的话还是选择用selenium,自动化测试的神器
正常来讲的话是把提交内容存到数据,然后再用xssbot去判断
但是这里权衡之下直接讲文件保存为一个html,然后在csrf接口去记录路径
我认为这是比较好的解决方案
最优的应该任然是csrf接口提交一次,xssbot访问一次,但是php和python的兼容我不太熟悉
所以可以考虑像入门题那样,采用python的框架直接编写题目
以下是xssbot的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import os

urlmain='http://localhost'
chdr='/var/www/chromedriver'
def get_url():
print('[+] begin to checking~')
path="html/submit_fdasfh2jfka"
filelist=os.listdir(path)
for files in filelist:
Olddir=os.path.join(path,files)
if os.path.isdir(Olddir):
continue
filep=path+'/'+files
if('index.html' in filep):
continue
cat_flag(filep)
os.remove(filep)
time.sleep(2)

def cat_flag(urlpath):
global driver
# url='http://localhost/'+urlpath
url=open(urlpath).readlines()[0]
print('[+] Testing '+url)
begin_url=urlmain+'/adminfg51g5d4saf26z3v1.php'
try:
driver.get(begin_url)
# driver.add_cookie({'name':'admin','value':'abc','path':'/'})
driver.get(url)
except:
driver.quit()
driver =webdriver.Chrome(chdr,chrome_options=chrome_options)
driver.set_page_load_timeout(10)
driver.set_script_timeout(10)


chrome_options = Options()
# specify headless mode
chrome_options.add_argument("--headless")
chrome_options.add_argument("--no-sandbox")

while(1):

print('[-] chrome loading...')
driver =webdriver.Chrome(chdr,chrome_options=chrome_options)
driver.set_page_load_timeout(10)
driver.set_script_timeout(10)

print('[+] chrome is ready...')
get_url()
driver.quit()
time.sleep(10)

cookie设置上最终选择了用一个页面去设置,因为直接设置玄学的出错了。

总结和反思

出题确实学了不少东西,很多东西确实要自己去写去尝试才能有进步
眼高手低是不行的,docekr是真的牛逼,可惜使用还不熟练

CATALOG
  1. 1. 出题真难
    1. 1.1. XSS出题入门
    2. 1.2. XSSbot
    3. 1.3. 总结和反思