转眼就17年9月了
看见一届一届的学弟学妹走进学校的时候 总是会笑着说 莫名其妙的又被催着升了一届
15年到17年的已经两年 两年间发生的事情太多 如果认真的整理起来的话 又要借用一句我最喜欢说的一句话
——简直头皮发麻

大一进学校的时候就想着要考研要考研 真的走到要考研的这条路上的时候 突然发现 这真的是一条一个人走的路 不会再有一个班或者一个学校的人陪着你做同样的事情了 我们都在没有察觉的时间里慢慢长大了
心态发生了很多很多的变化
见过了很多人 发生了很多事情 改变了对很多事情的看法
我找到了人生的第一个漏洞 我收到过人生的第一份offer 我遇到了很多很棒很温柔的朋友 我也遇见了第一次见面就想到未来的人
我做过重大的决定 放下了学了挺久的算法 放下了收到的offer

一开始决定从算法转安全的时候 这个想法从脑海里冒出来的那一刻 我觉得自己应该是疯掉了 -3-
我花费了半学期的时间 学了一些算法 虽然说是皮毛 却也刷了很多题目 熬过很多夜 慢慢从一个在班里闹腾不休的人 就如同销声匿迹一样
emmmm 我确实失去了一些学校里曾经玩的比较好的朋友
我也得到了很多更好的朋友 志同道合的朋友 一些我曾经没有想过会遇到的好朋友

后来就开始在这条路上跌跌撞撞的走着
很累很累 有的时候累的开始思考人生 是不是应该和别人一样 好好的把自己的专业学好 不要去学安全了 省的每年期末还要痛苦的复习
我自诩是一个抗压能力强的人 却也被打击的差点爬不起来
已经过了能放肆喊出口号的年纪了 但是也不喜欢没有用的鸡汤 感觉未来的路还会很长 应该会好起来的吧
想努力一下把自己送上更高的台阶 也算是跨过自己当初高考没有考好的一个坎
习惯了什么之后就不会再惧怕什么了 所以日常起床对自己说 再努力一下吧 未来太多的不确定的事情了 做一个努力对得起我自己的人
2333333 似乎我成年之前每天都在做对不起我自己的事情 搞事搞事和搞事 -3-
总得做一个对自己负责任的人 做一个比较棒的人 -3-
一切都会好起来的吧~ 不努力的话 可能我就真的再也接触不到更好的人和事物了

emmmmm~
那加油 考研这条路一旦决定走上就不回头啦 加油吧~

一张晚上回宿舍的路上拍的照片
某天的雨夜 每天必过的天桥 每天都有不一样的风景

0x01

mysql一些简单的基础知识

可能存在sql注入的一些常见url形式

  • http://www.******.com/***.asp?id=xx (ASP 注入)
  • http://www.******.com/***.php?id=xx (PHP 注入)
  • http://www.******.com/***.jsp?id=xx (JSP 注入)
  • http://www.******.com/***.jspx?id=xx (JSPX 注入)
  • http://www.******.com/***.asp?id=xx&page=99 (有两个参数,注入时要注意参数的确认)
  • http://www.******.com/index/new/id/8 (伪静态)
  • http://www.******.com/index/new/php-8.html (伪静态)

常用的判断是否存在sql注入的方法

  • 符号法:通过在链接的参数后面添加单引号或是双引号,如果页面报错,或者返回不正常,则可能存在注入
  • 1=1和1=2:在链接后面加上“1=1”或者“1=2”,如果两种情况下,页面显示出的结果不同,则可能存在注入

0x02

在新版的MySQL 5 版本数据库中,新增加了information_schema数据库,该库中储存了数据库信息内容,可以直接进行爆库、爆表、爆字段,攻击变得更简单。
schemata表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
tables表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
colunms表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

接下来详细的看看几张表里的东西
select * from information_schema.schemata;


不难看出第二个字段schema_name为mysql中存储的数据库的名字

select * from information_schema.tables;


这一张图有点乱,但是我们可以看出来TABLE_SCHEMATABLE_NAME字段里存储的是每一个数据库的名字以及数据库对应的表名,我们可以把这两个字段单独提出来
select table_schema,table_name from information_schema.tables;


不难看出,不同的数据库与其对应的表一一对应

select * from information_schema.columns limit 10 ;


因为这里显示的是每一个数据库里的每一张表对应的每一个字段,全部读出来的话,我自己都等不下去Orz,就只读了前十条
但是可以看出 TABLE_SCHEMATABLE_NAMECOLUMN_NAME 三个字段对应的的分别是数据库名,表名,表中字段名

所以可以通过一下的方式进行数据库中数据内容的整体读取

同时我们可以通过order by n爆出表中的字段,其中n指的是猜测的字段数字1,2……n诸如此类,直到报错,则输入的n-1是该表中的字段数
当然还有很多姿势,后面慢慢会说到

0x03
关于注入类型,简单的分为以下三种

  • 数字型:select * from users where id=$id
  • 字符型:select * from users where id=’$id’
  • 搜索型:select * from users where username like ‘%admin%’

注入方式:

  • 数字型:select * from users where id=$id and 1=1
  • 字符型:select * from users where id=’$id’这里需要闭合引号使用’ and 1=1 ‘
  • 搜索型:select * from users where username like ‘%admin%’这里需要闭合引号以及百分号 %’ and 1=1 ‘%

提交注入方式

  • GET型:直接在url里进行注入测试
  • POST型:firefox可以使用hackbar进行post数据的提交,其他浏览器可以通过burp抓包,然后进行参数提交;有些post型注入也可以通过补全地址变为get型进行注入测试
  • Cookie提交:使用burp抓包后可修改cookie

0x01

这个真的是呕心沥血

花了很久的时间来研究,真的超级心塞。由于这些误区直接导致我浪费了很久时间来研究自己到底是哪个地方出现了问题,好在最后在各位师傅们的帮助下,虽然摔得头破血流也算是没有白白浪费。

0x02 关于防爬

关于time模块的一些碎碎念

在模拟抓取新浪微博的用户头像url时,我一开始的代码是这个样子的

然后
给我预料之外的来了个我当时都没有反应过来的报错
Traceback (most recent call last):
File "G:\pycharm\vuLogin\weibourl.py", line 16, in
url=driver.find_element_by_xpath("//p[@class='photo_wrap']/img").get_attribute('src')
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 295, in find_element_by_xpath
return self.find_element(by=By.XPATH, value=xpath)
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 754, in find_element
'value': value})['value']
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute
self.error_handler.check_response(response)
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//p[@class='photo_wrap']/img"}
(Session info: chrome=56.0.2924.87)
(Driver info: chromedriver=2.28.455520 (cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 10.0.14393 x86_64)

其实也没什么好看的,重点的地方就在倒数第三行的这里selenium.common.exceptions.NoSuchElementException: Message: no such element:
简单粗暴的翻译就是,你要找的这个元素我找不到 ╮( ̄▽ ̄)╭
我当时是在怀疑人生的,毕竟网页也打开了,什么都搞定了,怎么会这样??

好吧,调试bug开始

遇到这样的问题,一般就从报错语句的上方开始排查问题,既然问题出现在url=driver.find_element_by_xpath("//p[@class='photo_wrap']/img").get_attribute('src')之前,但是页面又的确可以打开,也证明了driver.get(url)以及以上的语句都是可以正确运行的,唯一的办法就是查找源码的问题,看看是不是源码出错。
print driver.page_source
打印出抓取的源码
看到源码的时候我的内心是崩溃的

抓取到的是微博开启了防爬机制后的源码,完全找不到任何和当前页面有关的代码啊!(╯‵□′)╯︵┴─┴
然后开始了漫长而又徒劳的百度,实际上百度并没有告诉我要怎么办,我委屈的去找了xrmht表哥,表哥很暖心的帮我跑了一遍代码,然后告诉我,我的代码和他一些别的爬虫代码不一样的地方在,我的代码里没有使用time.sleep()这个推迟调线程的时间函数,让我去修改一下看看。
真的是听君一句话,胜过半天的百度。

果然抓到了我需要的用户头像的url
后来的代码是这样子的

成功的抓取到了url!!
http://tva1.sinaimg.cn/crop.16.0.412.412.180/7f7d6a25gw1eoesw1hax6j20c80bjdhq.jpg
因为有的网站存在防爬机制,只需要加上time.sleep()函数即可

0x03 关于登录前的一些步骤

抓取是抓取结束了啊,但是我还是要模拟登陆啊,我以为解决了time的问题就万事大吉了,果然我太天真了 QAQ
代码呈上

然后报错
Traceback (most recent call last):
File "G:\pycharm\vuLogin\loginJD.py", line 17, in
username=driver.find_element_by_xpath('//input[@id="loginname"]').send_keys('用户名')
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 347, in send_keys
self._execute(Command.SEND_KEYS_TO_ELEMENT, {'value': keys_to_typing(value)})
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webelement.py", line 491, in _execute
return self._parent.execute(command, params)
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 238, in execute
self.error_handler.check_response(response)
File "E:\Sakura\python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 193, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
(Session info: chrome=56.0.2924.87)
(Driver info: chromedriver=2.28.455520 (cc17746adff54984afff480136733114c6b3704b),platform=Windows NT 10.0.14393 x86_64)

重点报错语句:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
大致的意思就是loginname这个元素不可见
于是我一脸懵逼的抓下了源代码,结果在源代码里找到了id="loginname"这个input输入框
我的内心是崩溃的,明明源代码已经读取到了怎么会不可见?????

无奈之下直接粘贴百度来的模拟登陆代码,根本不行,毕竟网页更新是正常的,之前的代码一定是不可以用了,然后我怀疑了一晚上的人生,拉着学长跑去吃了一顿饭,思考了半天依旧没有任何思路,觉得这一定是人品问题了。

第二天,跑到了一些群里问也没有回复,突然想起来认识一个写爬虫的表姐,委屈巴巴的问了这个问题,小姐姐让我发了一下链接,然后一语道破:
https://passport.jd.com/new/login.aspx
这个页面打开之后是下面这个样子

如果需要使用账号密码登录,需要点击账户登录,如果不点击的话,是没有办法获取到那个文本框的,所以上面的报错是元素不可见,而不是不存在。
个人的理解就是因为是模拟浏览器登录,所以每一步都要为它做好,包括点击账号密码登录框
于是修改了代码,果然可以了~

噢耶~ (〃ω〃)

0x03

登录好了之后真的是开心得不得了,浪里个浪

然后打算来抓一抓京东的别的价格,于是就有了新的一轮折腾,至此也感觉算是稍微了解了selenuim模拟浏览器的真正意思
url:https://shouji.jd.com/
起源是我的手机屏幕被我一不小心摔碎了,真的感觉严重影响我看动漫的质量,随手翻了一下京东,想看看手机都是什么价格,反正买不起

看了一下高性价比这一栏,准备抓一下优品推荐里的手机价格~
然后写代码

结果就是不报错,只能抓到一片空格,还带换行的 QWQ
果然python不会这么轻易放过我,永远都数不尽的bug 〒▽〒
然鹅我也的确习惯了
之后尝试了点击优品推荐这个标签也不行
真的是心灰意冷到怀疑人生

外面还在下雨,晚饭还没吃,当时真的蛮想放弃的,然后在也不知道第多少次尝试的时候,在模拟浏览器打开后顺手来了最大化,然后滑到了那个页面,结果!!!结果!!!价格抓下来了!!!
狂喜!!!
真的是感觉一道阳光照进了生命!
当时就突然反应过来了,因为在程序自动打开浏览器的时候,这些元素在当前情况下是看不见的,需要下滑鼠标才可以,而且还需要暂停在该界面1-2s确保页面读取完毕
代码如下:

最后成功抓到价格
¥1499.00
¥1549.00
¥2299.00
¥2899.00
¥2299.00
¥949.00
¥2699.00
¥2798.00

从这个时候开始我就不太喜欢selenium了,相当于是自己操作浏览器,抓取动态元素的时候也就需要考虑到页面的最大化,将鼠标滑动到元素直至可见,以及各种页面问题
一点点的没考虑到有可能爆出各种bug

还是尝试一下不要打开浏览器的方式比较好
( ・ˍ・)
果然还是要去学scrapy-splash和Phantomjs

0x01

其实我是打算先写scrapy框架学习的,但是真的是被表哥催着,=3=,所以只能先写四(等我把三补上我就把这句话删掉)
最开始接触动态抓取页面呢,当时想抓一个微博用户的头像url,然后我兴奋得不得了,写了一个普通静态的脚本,反正也抓不到什么东西,我就不往这里贴代码了

抓不到东西的我很是崩溃啊,我真的以为是我的xpath写错了,但是无论怎么匹配,结果都是输出"[]"
然后再al0ne表哥的提示下,查看了源代码,发现这个是一个动态的js渲染的网页,当时我是很想找个人谈谈人生

完全不会啊!然后立刻上网搜集动态网页相关的博客之类的
在这里还是要偷偷吐槽一句话,C*D*很多博客都是相同的,却都写着自己原创。。。╮(╯▽╰)╭
然后花了半天时间去研究了一下关于selenuim模拟抓取的方法
因为动态的网页有的时候是可以从xhr里面看见一些源码的,我说的咧就是像weibo这样,xhr里面只有空空荡荡一片的,网页全靠js渲染的动态网页抓取啦
所以,开始啦

0x02

万事开头难啊,最难的就是安装,不过好在这一次的安装全程竟然没有出一点点乱子ヾ(o◕∀◕)ノ
直接pip install selenium
就阔以啦
然后输入以下的代码运行
(≖ ‿ ≖)✧

hhhhhhhhhhh是不是报错了(~ ̄▽ ̄~)
那是因为你没有安装chrome的驱动呀
点击这个链接即可下载Chrome浏览器驱动======>>Chrome浏览器驱动下载,必须要翻墙,╮( ̄▽ ̄)╭
我真的发现每次安装对我来说都是一场劫难,还有配置一堆七七八八的东西(╯‵□′)╯︵┻━┻ ,网上教程竟然全是MAC下的放置方式 Σ(  ̄□ ̄;) 看来是我太穷了,只能自己摸索了
下载好之后,解压,里面会有一个.exe文件,直接放在你的python文件目录下面!!
这一步是为了写脚本的时候可以执行
然后再放一份在C:\Program Files (x86)\Google\Chrome\Application下面,也就是谷歌浏览器的文件夹下
然后配置环境变量,如图

这一步是为了在交互可以执行
就此,无论是在脚本里面执行,还是在交互界面,都不会报错

0x03

其实selenuim算是一个很强大的工具模块,但是我们最经常用到的就是webdriver模块
然后开始写脚本,关于selenuim的用法,我上传到云盘里,表哥们可以自取,算是半个官方文档====>selenuim webdriver使用秘籍
接下来直接上脚本,模拟登录京东

这样子就结束啦~~

不知道是因为现在的jd登录页面改变了了还是怎么了,网络上找到的所有的代码,全部是无法登录的 T_T

表哥说新浪微博的模拟登陆方式吗~~总是要留一个你们自己试一试呀 =3=
如果有需要的话,发送邮件到lirsakura@163.com直接找我要就可以啦

欢迎各位表哥多多交流啦~

0x04

让你们来看看selenuim真正厉害的地方吧~
真的是动态抓取咯

抓取京东的手机价格

是不是把手机价格抓下来啦~
反正我也买不起