2017年8月

我一直相信,每个宣称自己是黑客的青少年,一定都有着某种非主流的情怀,这情怀无法由颜值担当,就只能籍技术派遣。我也不例外。 ——来自《我的校园黑客故事》 - 王登科

很多热爱网络的人都向往着黑客,这种情愫在懵懂时最是旺盛而又随着年龄逐渐淡去。我接触互联网的时间不算早,也正是互联网聚变的时期,不过那个时候肉鸡和宽带付费最是火热的时候。

我的启蒙时期也是在那个时候开始的。懵懂时期的一些事儿实在丢人现眼,就从高中毕业开始说起吧。

考上专科几乎没有其他原因,高中不努力。而我打算报考单独招生考试,流程大概是先到意向学校官网报名,然后缴费,按考试时间参加学校的考试,最后就是等录取消息了。在各种纠结之后,还是网上报名了母校的单招考试。

而不争的事实是每个学校都有一个漏洞百出的官网。报完名之后,习惯性的翻了翻学校的站点,asp写的后台,在版权信息部分找到了管理入口,进入后习惯性的试了几个弱口令,未果。准备关掉浏览器的时候试着 SQL 注入 ' or 1=1

「欢迎回来,管理员。」

对,这么草率。抑制住内心的欣喜开始爬后台。按照以往的流程是:找上传入口上传木马或者写马,然后上传cmd.exe进行提权。

没找到上传入口!?

带着疑问,翻看已经发布的文章,居然还真没发过一张图片。只好作罢,继续看看还有什么有价值的东西。虽然没有上传入口,而这个账号的权限却不低,关闭报名入口,删改/下载学院的学生名单都不在话下,甚至在文章里追加一段恶意 javascript 还可以继续深挖。

快速浏览了后台,名单中包含的信息非常详细,姓名、年龄、身份证、手机号,甚至你家住哪儿村哪个屯。看着庞大的表格,居然有些不知所措。

这是否可以做点文章?

那是当然,在离考试前几天,我将它参照乌云的格式写成漏洞报告书然后打印了出来。详细的论述了漏洞地址,漏洞属性,漏洞测试,然后把后台截了两张图,最后,写出了两点修复意见。要么就把管理界面隐藏起来,要么就是过滤关键字或者转义。

考试前一天,特长生需要提前到学校报道,把高中的各种证书拿出来复印了一份,临走前将漏洞报告书递给招生老师,让帮忙带给网站管理员。其实提交报告书的时候,手都在抖。尽管报告书尾页标注的「以上为友情测试,本人承认未下载、删除、修改任何数据,未公开该漏洞…」,但是「未经过授权的渗透测试属于违法行为」

考试完走出校门,自豪感涌上心头。

事后发现当时的行为实在鲁莽,也十分感谢学校既往不咎:

非常感谢提交漏洞和对xxxx的支持,我们已第一时间将漏洞修复完毕,并抓捕了你。 —— 袁炜事件

后来啊。一直忙于各种闲事儿,也很少去搞破事儿了。不过大二左右,无聊逛着学校官网,找到图书馆的系统,通过机房内网尝试注入,找到上传漏洞并上传了小马,接着写了一只大马,提权进入了服务器,不过该站点长时间未更新又是一个很偏的一个子系统,C盘D盘草草翻了下也没有什么价值,然后溜达了一圈就关掉了。

从 QQ 空间翻出来的老照片

刚刚想起来还有这茬,重新打开图书馆官网看到最近有更新文章,便联系站点底部馆长邮箱,告知该漏洞信息并提醒修复,发出去两分钟就给回信了,『好的,谢谢你!』,不过该漏洞尚未修复,也就暂不公开了,邮件截图等漏洞修复完成了再补图吧。

更新:2017-8-29 补图邮件

2017-8-29 补图

是的,我始终未成为年少时理想中的黑客。

以上,我的黑客故事。

世上三大最难懂:医生的处方、道士的符、程序员的正则

学了几年编程,也写了不少项目,业务逻辑经验攒了一堆,基础知识却落下不少。其中很多还非常重要,比如:进制换算、正则表达式、算法。当初学这些东西的时候,对高数的抗拒让我对带计算的东西也十分抵触。但是,身为码农,这些基础都不懂还怎么拿代码换烟钱?于是,决定恶补一下。

正则表达式

正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。 ——来自维基百科

使用场景

正则表达式起始日常生活中也用过,比如搜索的时候用的*匹配(好吧,那个应该准确的叫做通配符,反正差不多就这意思嘛),下面谈谈正则使用的场景:

  1. 手机号、邮箱、
  2. URL判断
  3. 配置文件、检索关键字
  4. 模板引擎

使用原则

由于正则会将通常一串字符挨个检索,如果没找到匹配项,会从开头一直匹配到结尾,所以说,正则表达式的效率非常低的,能用内置函数尽量用内置函数。不过,一些特定场景正则表达式有他独有的优势

总结:能不用就尽量不用。

语法定义

能不用就不用不代表不学习啊,万一哪天面试就考到你正则不可能瞎写一通吧。即便是做项目在网上复制的现成的也要明白个大概意思。

组成部分

其实组成部分是很多的,这里只做基础介绍。以能写出简单正则,能看懂正则意思为目的。

正则的组成:

  1. 定界符
  2. 原子
  3. 元字符
  4. 模式修正符

匹配规则:

  1. 从左到右
  2. 默认贪婪匹配(简述就是匹配成功后继续匹配,参见#贪婪模式

定界符

定界符是正则表达式的边界,这个没有严格规定,通常以/作为正则的定界符。规则是:不能使用0-9a-zA-Z\和空格。

原子

原子在化学中讲过吧,是最小的单位。而正则中的原子同理,也是正则中最小的单位,不可再分割了。

  • \d:包含0-9
  • \D:不包含0-9
  • \w:包含0-9a-zA-Z_
  • \W:不包含0-9a-zA-Z_
  • \s:包含空白字符、空格、\n\t\r
  • \S:不包含上诉空白字符
  • \b:词边界
  • \B:非词边界
  • []:原子列表,可匹配列表原子或字符出串
  • [^]:取反,写在原子列表里为取反
  • .:除\n以外任意字符

元字符

元字符是用来修饰原子的,不能单独存在,写在原子之后

  • *:匹配任意次
  • +:至少出现一次
  • ?:可有可无,最多一次
  • {}:指定次数

    * ``{10}``:指定十次
    * ``{3,5}``:指定3-5次
    * ``{3,}``:至少3次
    * ``{0,3}``:0-3次
  • ^:指定以某个原子开头(千万别记混[^]^的区别)
  • \A:与^相同
  • $:指定以什么结尾
  • \Z:与$相同
  • |:或
  • ():限制优先级,括号里为一个整体。子模式:参见#子模式

模式修正符

与元字符用于修饰原子,而模式修正符用于修正整个正则表达式。而模式修正符必须写在正则表达式的后面

  • i:忽略大小写
  • m:多行匹配
  • s:让.匹配到\n
  • x:忽略正则表达式中的空格
  • A:与\A^一样
  • U:正则贪婪模式取反

组合

原子与不同元字符组合可以达到很多的效果,而多个元字符可以同时修饰一个原子

  • .+?:取消贪婪匹配,只匹配一个字符
  • .*?:取消贪婪匹配,匹配出0个字符

贪婪模式

仅从应用角度分析,可以这样认为,贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。 ——来自[正则基础之——贪婪与非贪婪模式
](http://blog.csdn.net/lxcnn/article/details/4756030)

子模式

我们可以使用小括号给整个匹配模式进行分组,默认情况下,每个分组会自动拥有一个组号,规则是,从左到右,以分组的左括号为标志,第一个出现的分组为组号1,第二个为组号2,以此类推。其中,分组0对应整个正则表达式。对整个正则匹配模式进行了分组以后,就可以进一步使用“向后引用”来重复搜索前面的某个分组匹配的文本。例如:\1代表分组1匹配的文本,\2代表分组2匹配的文本等等 ——来自正则表达式的子模式详解

样例

由于正则的字符实在"火星",所以需要多加练习才能真正明白其匹配规则,下面写几个样例,以后需要直接用。

判断手机号

分析

手机号一般为11位纯数字,1打头,第二位号码段主要以3,4,5,7,8为主(个人猜测),第三位到最后一位为0-9的随机数。

代码

/^1[34578]\d{9}$/

判断邮箱

分析

邮箱号格式是[email protected],字符串中包含一个@和一个.,其他字符分为三段,第一段以0-9a-zA-Z-_组成且至少一位,第二段以0-9a-zA-Z-组成且至少一位,第三段以a-zA-Z组成且至少两位(中文域名就算了吧)。

代码

/\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/

总结

在实际开发中所遇到的正则无非就那么几种,网上有很多大佬写好的直接可以用,而自己写的一些正则可以存下笔记,以便以后遇到相同的需求可以直接使用,毕竟效率最重要。

文档