
暂无个人介绍
本次分享内容:insert update delete对数据表操作的一些基本问题及例题分享。 insert语法介绍insert插入到某张表中,后面跟上设置的参数以及值。在insert的时候可以使用哪些注入方法呢? 比如这个报错的方法,如果报错可以使用,那么同理其他函数也是可以使用的。 首先看下语句使用,如下图: update 语法介绍update 即对整张表做数据更新 我们在set 这个位置做一个注入,报错后可以带出数据: delete语法介绍delete即删除表中的数据 例如我删除id=7的数据 例题分享 我们发现引号不能传入反斜杠可以传入,反斜杠的作用就是让引号失效。 我们全部清掉重新推导一遍,/进去之后,那么这里就会连起来。 在他后面去跟一个逗号, 我们看能否可以直接注入语句,如果直接传入注入语句,select database 是可以直接传进去的。database后面的字符把它闭合掉。 思路:要去猜它的一个基本模型是什么,然后你才能做出对应的推测,进而推测出它的语法。,否则注入不进去。 通过插入“/ ”让他的第一个参数中的引号失效,和第二个变量中的第一个引号闭合掉。 根据他给的提示我们再构造语句: 这就是通过注入拿到了我们想要的flag
bool型盲注有区别与之前的基于时间的盲注,bool型盲注的页面输入会影响输出。我们来看操作理解一下:语句结构id=1 ,我们去做判断的时候是id=1 and 1=1,and 1=1的本质是返回一个true,true可以用1来代替,正常回显。我们很多时候就会去接and=0,0类似于1=2返回是false, false类似于0的作用。 最后会影响到查询结果的是后面的0和1。 比如说触发查询数据,if触达的sleep执行成功返回SLEEP,执行失败返回0, 如果映射到bool型盲注这里不再是sleep,返回的结果变成1和0,如果if语句成功执行,它返回结果就是1和1,它不能成功执行返回的就是1和0。可以根据页面的返回内容来判断出到底语句查询是成功还是失败。bool型盲注的逻辑和基于时间的盲注是类似的,只不过判断的方法上是略微有点区别。理解了基于时间的盲注后再回过头来理解bool型盲注其实还应该是比较容易的。 先分享一些场景下截取相关的函数作为知识补充,然后分享一道题。 (说起截取函数在第三节内容中提到过SUBSTRING函数,它是支持这种结构的,) mid函数 、ORD()函数 、ASCII()函数 题目分享: 连接数据库操作,查询user id是否存在,如果存在这个值,查询出数据是一条就会进入到下面的一个逻辑中去。我们刚才返回的是“ error password”,出现这个结果是因为下面逻辑没有满足: 针对bool型注入,是不是只要你能够有一个true and fasle,就可以了,可以针对下面这个语句进行注入: 如果数据中存在id就会走到上面的if else 逻辑里面去,因为我们不知道密码,最终返回的是error password。如果id是不存在的,它返回来就不会是一条是零条,所以它返回的就是一个error user id。 验证一下,我们将user id 改成0 返回的是 error userid,说明,当userid 是0或1的时候对输出产生了影响,基于这里,我们就已经可以对它做一个盲注。我们来写一下脚本,和之前的逻辑一样引入一个库:写脚本思路: 对它做一个分割和分离,分离的时候我们要看他的过滤机制到底是哪一些。 *- 空格不能用,但可以用内联注释 不能引号就用阿斯克码来代替* 小于127,返回error password, 大于127,返回 error userid。 做盲注的时候可以将大于号变成等号,用二分法更快一点。 再举一个放字母的栗子: 直接复制下链接: 请求发出去之后对它做一个判断,定义一个变量,操作如图: 可以随便设time,out,但不能设太低,会直接报错。这个请求发出去后会有一个response返回来,如果我们去检测response中的内容, 我们想要的是error password(content就是response中的页面的信息),针对页面信息我们去做个匹配,使用find进行匹配,找不到就返回-1,找到了就要做个添加,操作如图: 找到后对返回值做添加: 继续等待返回结果: 以上内容参考安全牛课堂《CTF从入门到提升》
基于时间的盲注,本次内容会涉及到写一些脚本。这里我先简单的示范,有两个网址推荐给大家, 看一下到底能不能影响到这个数据,这里用一个插件。 这个插件更新之前还挺好用的,更新之后就不太好用了。这里添加三个参数。 第一个,添加字段头用哪一个网址,这里添加了Headername,添加字段的名称X-Forwarded-For,然后到页面开启。 我们会发现它可以成功去修改它回写的内容,这个数据段是可控的,用字段去做一个注入,它就变成了一道注入题。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:4分16秒) 所以有的时候你也肯定是可以的,如果可以做事的话,向着相对会麻烦一些。我们就要考虑到如有没有说不用注释的方式去它做一个注入。而且我们这个时候你会发现,其实因为之前不回选题到了吗?我们这个时候必然考虑的是使用一个基于时间的一个盲注来做一个注入的,那么就是如何实现的问题了。如何来实现呢? 我们希望SLEEP引用的是一个计算过程。我们可以看一下看,到底是不是? (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:10分39秒) SLEEP函数产生了延时,我们在insert的时候插入的是数据。 在实际环境中’闭合是什么样呢?看一下操作 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:12分34) 逗号来自于if条件,除了if以外还有另一种方法。就是使用CASE WHEN这种形式去做一个触发。 用select case的方式。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:19分21秒) 如果是写脚本怎么写呢, (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:22分38秒) 我们做循环的时候,先从数据库中读出的数据段的长度来考虑。一般不会太长。这是第外层循环,然后是内层循环,内存循环就是类似于阿斯科码值。 类似于字典,比如说dic定义一个变量, (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时4:27分39秒) 其实这种写脚本总体思路还是比较简单,很多时候要注意一下一些细节。多试一试,其实就会好一些。 以上动手演示可见:安全牛课堂《CTF从入门到提升》
本次内容会先介绍一些函数,然后结合一些题目进行讲解。这里的基于时间是指延时。 我们对于盲注最早接触的应该就是SLEEP函数, 很多编程语言中都有它。函数的特点就是添加延时功能,我们可以看一下它的一个效果是什么样子的。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:1分10秒) 举栗子: 在添加了SLEEP函数之后,它的运行结果要是变慢了,而且它的变慢的时间和我们填的设置的时间是接近的,或者说是长于这个时间的。那么就能够验证佐证就是说我们sleep的函数它产生了这个效果: 刚刚的演示过程,我们输入的代码和正常的访问产生了差异。( 有延时就说明我们的代码生效了,没有延时就说明没有生效。) 整张表只有四条数据,id=1,基于逻辑上判断来说,2逻辑前面为真。id=1之后,它后面的逻辑就不管会不会运行SLEEP,但是针对表中的234,id≠1的,它就会去判断后面这个逻辑,这个时候它就会都去做一个延时,运行一个SLEEP(3)。 延时数据需要一些配合,当前数据库是sectest,很多时候我们去提供一个约束条件(查询条件)的时候,它如果能查出数据来,其实就是告诉我们表中存在一条数据等于admin,或后面有and的时候,它就能够去触发这个效果,整个词的查比较困难一些。但是我们要是换成一个字母一个字母的去查,就会快很多。这里提到if条件,它其实是一个判断语句,它有三个表达式,可以接收三个参数。 Expr1是一个判断语句。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:9分41秒) 然后这个时候我们再回过头来看一下这些截取函数,做单字母的判断,就是把查询出来的结果做一下拆分。我们来看一下这些函数。第一个就是刚才用SUBSTRING函数,其实它也是个截距函数。比如说我去查一个字符串是ABCDE 5个字母,第一个参数它其实就是代表要被它拆分截取的一个字符串,第二个参数就是position,下一个参数就是length。 另一个函数SUBSTING这个函数其实也是类似的: (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:15分41秒) 我们可以看一下例子: 比如说是AAABBBCCC count是去计算关键词出现的次数。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:18分14秒) 有的时候方式可以多一些。这里提到既然rlike可以用的话,那么对于正则表达式的一个匹配,还有一个regexp可以对它做一个正则匹配。 除了if还有很多的方就还有其他方式做语法表达。 case在很多编程语言中都理解成是某种情况,根据case也能做一个触发case,当什么的时候什么条件下,它就会触发一个什么效果。 举几个例子: (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:23分30秒) 不想用引号怎么办,那我就要去配合使用阿斯克。把它转成阿斯克码值来做一个判断。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:27分37秒) 反过来阿斯科码只是一个97,对它做一个阿斯科码的转换,第一个返回值用SLEEP函数。 SOPSTR去分割DATABSE,DATABSE是一个全局变量。SUPSTR(1,1)他这时候的返回的结果是一个字母,它的阿斯克码值就应该是115。如果不是115的时候,比如说114,它是秒回,那么通过这样子,就可以判断115就是第一个DATABSE这个变量的第一个字母的阿斯科码值,也可以反推。 除了SLEEP之外还有一些函数,重复执行某个函数。 BENCHMARK 计算它的处理速度,就是说比如说表达式定义好了之后,这靠的就是它运算次数。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:30分58秒) 延时的目的其实查询语句都是一致的,只不过最后如何让它产生延时,很有可能是CTF题目中需要想要你去考虑的一个问题。 笛卡尔积 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:34分42秒) GET_LOCK 就是说它其实类似于上锁的一个问题,对一个字母上了锁之后,下再去查字符串就会产生一个延时。 可以看一下get knock (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时3:39分) 构造一个长字符串,然后再做一个匹配,然后就返回得非常慢。所以这里也只是可以有个了解,那我们来看一下看这个效果。 以上动手演示可见:安全牛课堂《CTF从入门到提升》
密码安全,顾名思义,它指的是对于我们密码的安全。 密码是我们生活中最常见的进行身份验证的一个因素,一般我们在登录系统或者是其他应用程序的时候,最先需要利用用户名和密码来验证我们的身份,这称为单因素身份验证。除了密码之外,我们还可以再进一步利用数字令牌、利用生物特征,比如虹膜扫描,视网膜扫描等来对你进行身份验证,但密码永远是最常见的身份验证的第一个因素。密码作为最基本的一个身份验证的因素,如果没有被保护好,或者被别人猜测到,而网站又没有做到足够的防护,没有检测或者其他加固的安全性措施的话,那么你的系统就完全暴露在攻击者面前,再也没有任何秘密可言。 P1常见密码攻击手段及其危害分析针对密码攻击的危害,以保险场景为例,保险公司的一个普通客户,突然某一天接到一个谎称是保险公司的客服电话,声称保单查询系统正在升级,需要提供登录保单查询系统的用户名和密码将系统升级。如果没有足够的安全防范的意识,透露了你的用户名和密码信息,那么对方可以通过一系列社会工程学攻击的手段,查询并修改你的信息,甚至是改动账户资金分配。 如果你的密码恰好是你最常用的一个密码,骗子将有可能用你的密码去撞库,接下来你会收到源源不断的外部保险推销的电话和异常登录的短信提示,造成严重的信息泄露。 再假设另外一个场景,比如保险公司有一个积分系统平台,客户可以利用自己的保费去换取积分,并在积分商城兑换相应的礼品。这个积分平台首先会对注册用户开放,如果他的密码设为最常见的123456这样的弱密码,积分平台被黑客仿冒登录后,把用户的积分去兑换为价值不菲的商品,并且邮寄到黑客指定的地址,造成了客户的损失。另外一方面对公司而言,客户会严重怀疑是保险公司系统有漏洞,导致了个人信息的泄露,会造成退保、投诉等业务损失。 所以由此看来,我们密码的各种各样的问题,会造成客户损失、客户投诉、业务损失和监管处罚。这样的事情其实在我们生活中每天都在发生,最终受影响的都是公司的业务。 常见密码攻击手段1.暴力破解 暴力破解是指把所有的数字、字母、包括特殊字符等等进行排列组合,把所有的组合尝试一遍来猜测这是不是用户正在使用的密码。虽然看起来比较笨拙,但是却是最有效的密码攻击的手段。 2.字典攻击 字典攻击比暴力破解稍微智能一点,根据受害人的个人信息,比如昵称、别名、名字、生日邮箱等等,生成一个可能使用的密码的字典。字典跑完,攻击也就随之结束,所以字典攻击的效果取决于这个字典的精准程度。 3.密码猜测 通过猜测常用的简单密码尝试登录账户,譬如123456或者生日等等。在这个过程中,你登陆失败的痕迹也会记录在审计日志里面。 4.彩虹表攻击哈希称为HASH,是用来保证数据完整性的一种手段,本质是一个数学函数,能够将不定长的字段经过哈希函数的运算都转换为固定长度的字段。 比如abc,或者ABC123,经过哈希之后,它会生成一段乱码,而看不到明文。 但哈希函数有一个不可逆的特性,就算能够得到它的哈希值,也无法逆推出原来的明文的那个值。 但黑客去对很多得明文去做哈希的运算,记录在一个表格里面,这个表就叫做彩虹表。将来黑客去对一个公司的数据库进行偷库,他看到数据库里面的一个密码字段,他可以到彩虹表里面去找对应的明文值,那么这就叫做彩虹表攻击。 它特征就是提前生成散列,那么当发现散列值的时候,用散列值比对出明文密码,这也是一种密码攻击的手段。 5.社会工程学攻击手段 社会工程学攻击手段本身是不依赖于任何的技术手段。 但如果利用人性的一系列的心理学的一些弱点,再结合一些技术手段,比如说结合一些矿产脚本攻击漏洞,结合调邮件等等的技术手段,它能发挥最大的一个攻击的效率。 常见的通过社会工程学攻击去获得密码的方式有哪些?像电话客服套取用户密码,肩窥、垃圾搜寻等方式去获取密码并尝试登录你的系统,能成功地进入公司的内网。 6.间谍软件 一种恶意软件,常伴随着我们的木马安装,一旦电脑感染了木马恶意程序,就可以偷窥电脑里面传输的所有的机密的信息,包括你的密码等等。 7.窃听攻击 一些内网嗅探工具,例如sniffer,可以用来抓取流量包,如果这个包里面的传输的协议使用的是ftp或者http这些明文协议,那么一旦被嗅探到,利用抓包工具里面的协议分析仪功能,就可以查看包里面的明文用户名密码等内容。 常见攻击用到的工具1.字典生成工具 Crunch、CUPP等 2.密码破解工具 Hydra、Medusa、Aircrack-ng等 3.钓鱼邮件,电话钓鱼攻击 只需要一个邮箱后者一部电话 P2常见密码安全风险行为密码是权限控制的第一道关卡,因为很多用户设置密码过于简单,登录的系统也并没有强制采用强密码策略,同时也没有采用其他的多因素身份验证的方式,包括用户的安全意识的不足,就容易遭受社会工程学攻击。而且密码被破解之后,缺乏异常登陆的报警,也没有能够及时地监测到密码的异常登陆,就会导致攻击频发。 我们有哪些常见的密码安全相关的风险的行为? 1.设置弱密码,例如123456这样的简单密码; 2.轻易相信别人,不验证别人身份就透露密码和密保问题; 3.密码一旦设置不再修改,包括使用共享密码; 4.密码主动外泄; 5.肩窥等等...... 我们威胁的主体就是常见的攻击者,就是所谓的黑客,他会利用各种各样的漏洞去发动攻击,从而造成我们所谓的风险。 弱密码本身就是一个漏洞,它会导致两类风险:第一个是外部风险,也就是说如果由于各种各样的原因造成客户信息的泄露、客户的投诉以及监管的惩罚,这些都是外部的风险; 第二个是内部风险,比如由于某种原因,后台的密码被攻破,那么黑客就可以去登录我们的系统的后台,植入webshell,夺取服务器的最高权限。甚至还可以不动声息地在我们的服务器上植入挖矿的软件,包括利用服务器发送垃圾邮件,成为发动拒绝服务攻击的一些傀儡。如果由于密码的漏洞被安装了间谍软件,那么内网的所有数据都会被监听,包括财务数据、开发的代码等等,企业内部也没有任何的秘密可言。 P3安全行为规范建议风险的常见处置方式1.风险的接受 2.风险的规避 3.风险的减小 4.风险的转移 风险控制的手段1.预防性控制 2.检测性控制 3.修复性控制 按照功能性,又可以分为: 1.物理性控制 2.逻辑性控制,又称技术性控制 3.管理性控制,又称行政性控制 常见的安全行为规范1.强密码策略 2.密码复杂度 3.密码历史 4.密码最长/最短使用时间 在设计系统的时候,除了做密码的验证,对密码实施强密码策略,对密码进行验证之外,还需要利用口令、令牌或者是生物验证等其他的方式去实施双因素或者多因素身份验证,仅靠密码身份验证进行验证是完全不够的。 另外一方面,密码找回的问题也不能过于简单,而且还要不断去验证它的一个身份等等,这都是密码设计的一个安全行为的规范。 最后在内网实施产品码策略,可以在预控服务器上去执行,通过组策略去实施密码长度、复杂度等强密码的一个策略,包括去实施账户地锁定的阙值、持续时间等等。也可以用于我们的线上的系统,这些都是一些密码相关的安全设计的规范,包括使用加密去存储账户密码,通过密码学的一些手段去实施密码的加密,不能以明文的形式存储密码。还要去定期的去做审计,及时去触发报警等等。 以上内容参考安全牛课堂 密码安全,涉及强密码策略,演示内网密码攻击示例,账户密码加固策略,以及简单的加密基本原理,对称加密非对称加密,公钥基础设施架构;风险危害透析、常见风险行为分析、安全行为规范建议、管理和技术手段建议等。
关于基于约束的SQL攻击在创建数据库的时候,一般会先定义整个表的结构,假设我要做的是登录入口,先简单地创建一个用户表。(用户表中,我这里是定义了三个字段,第一个是ID,然后第二个是用户名) 表已经建完之后,看起来也没什么问题,那么如果说我开发完了之后,应该有个登录入口。 对没有账号的人来说,需要有一个注册入口。注册的本质是一个insert的过程,就是往里插入一条数据。假如里面数据库没有数据,我就要往里加一个管理员账户。这个管理员我就会对它设置成admin,密码是12346789。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:3分0秒) 先去创建这张数据表,看一下,然后去创建一张,对吧?只有两张表,然后我就去对uc。里面是空的,对吧?我接下来就往里插条数据insert。 刚才我们提到了去注册的时候,它的本质其实是我们一起插入一条数据,它的长度是有限制的,它限制了30位,如果说我们插入31位会这样,它会自动的把31位就是说大于30的东西给吃掉,就是相当于抹掉了,它只会插入前30位。 那么查出去插入的时候,它肯定会先去查一下,你去操作数据在表中原来存不存在。假设我去插了一个31位的数据,它自然表中是永远不会存在的,那么它就会把这31位的数据往表里去插。 比如说用户名是这个密码是大于六位,且包含大写字母小写字母和数字。这么复杂的大写字母小写字母和数字,我就随便设一个,比如说大写字母,这正常登录试试看。大写字母小写字母数字就做一个段落。密码就是一个去做一个登录,发现这个时候就成功了,所以这个就是一个基于约束攻击的简单介绍。 题目: (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:10分20秒) 基于约束的就讲这么多。接下来的话就讲一下报错注的一些问题,然后去做一个简单的分析,然后也会结合一道题目来讲解。 首先来看一个简单的一个公式,直接往上套就可以去用了,但是我觉得既然学了还是要能了解就去了解一下。 报错注入首先要去了解一下一些函数: flow函数是向下取整。如果我们将rand*2之后,它的结果其实就会有0和1两个结果。 这张表它其实就是默认会存在,而且这张数据表中的行数是很大的,后面我们也会去讲到这个问题。在盲注中会用到一些笛卡尔积的形式调数据表数据量的问题。这个地方其实表中的数据量是很大的,所以说这个地方就是跟数据量会有一个关系,然后也可能跟后面的也会有一定的关系,要不然也不用这个横竖了。 我们再继续向下看, 它这个地方就是010101001,是这样子,我第二次再执行一次。0011,这两次的执行结果是不一样的,你首先明白这个问题,然后第二另外一条语句它是加了一个0。 像这地方可以看一下,如果说0选中之后,去看这个序列,它是01101100的,即前几位,我们再去做一个01101100。所以说他的前几位序列是一致的,而且你要明白一个点,就是说刚才我们去看它产生报错的原因,是不是一条数据不报错,然后调出两条数据开始报错,三条数据也可能报错。它报出的前提条件就是前面几条数据有就可以了,但到底需要几条数据,这个地方我们要进一步去看。那么所以说他肯定和序列是有关系的,因为像这种不加零的情况下,它是随机报错,就是两条数据,三条数据随机报错,但是加0必然报错。 这个地方我们来看下演示。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:21分26秒) 如果是不加零的话,我们可以是验证一下我的说法。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:23分40秒) group,by的话它key这一列它其实必然是唯一的,不能出现重复,那么这个时候它就不符合表的一个结构问题,它自然就会报错了。就是这样的一个逻辑,可以看一下。 首先它会去建立一个虚拟表,就是我刚才演示的演示的一个表,组件就是像这个地方一样的,就像这个地方那样列明,然后这个是它数量: 发现第一条结果为零,查询虚拟表0不存在,它要做一次插入。插入的时候,本质其实是第二次调用,第二次调用就会在被计算一次,那么这时候插入的其实就是一个E那么插入了一周,接下来又是个E0110和幺序列,就这个序列对吧?那么又正常一的数量上去加一就是结果就是K等于1,它的那么就是数量事儿,对吧?然后接下来又是个零011,就会重复上一次的操作,查到的是零,它又想插个1,1是存在的,所以就会报错了。 去做一个插入,本质是第二次计算,第二次计算它就会超的一个实际值,然后第三次计算又是一个查询,查询之后又会做一个插入,那么如果它出现报错,其实只要是插入的值两次是一致的,它就会报错,所以说在你只有表中只有两条数据的时候,如果是随机数,那它就有可能去报错,因为你两次超过值都是一样的。产生一个序列是一个0101,假设就是个去掉,查到一个0插入个1,而且它查到又是个0,又查个1,这时候就直接报错了。但是其实它查的数据只有两行,这个就是数据量少的时候报错的原因。 我们再仔细来看一下这个语句这条数据。 它报错的关键点其实是在于这个里面的这条数据,假如在于这条数据,我们可以把它复制出来看一下。 不一定要用0和1来代,只是为了方便大家理解。 除了这个报错函数之外,还有很多的其他的报错函数可以再去看一下,因为格式不符自然就要报错。 像这个函数可以看一下,它的报错,其实就是有局限性。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时2:41分27秒) 这包括函数的基本原理就是这些。接下来的话我们去看一个题目,这是来自于实验题目。
CTF入门到放弃为什么说是从入门到放弃呢?(开个玩笑)如果说大家对CTF有了解的话,其实应该知道CTF是一个什么类型的比赛,这个比赛涉及的范围和影响有多大。如果说你真的想打好比赛,那也是真的非常不容易的,所以说这是非常困难的一件事情,初期可能学着学着就想放弃了,所以我就以这个来作为一个标题,当然本意不是让大家去放弃,就是为了让大家入个门然后再提升! 我会和我朋友一起来完成这门课程的讲解。 课程主要针对web MISC密码学,内容会尽可能多地去覆盖常见比赛中涉及到的一些考点解题技巧等,我们会先举例简单的考点考题作为案例来讲解一下。 这样的大家在学的同时可以上手做一个实验,便于理解和掌握。大家有什么问题可以留言,我们会回复大家的。 我们进入正式课程,说到CTF它是什么有什么故事呢?以下是百度百科的定义: CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球大会,以代替之前们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式。DEFCON作为CTF赛制的一个发源地,DEFCON CTF成为了目前全球最高技术水平的和影响力的一个CTF竞赛,类似于CTF赛场中的“世界杯”。 关于比赛模式常见的竞赛模式我这里只举了两种(百度百科上还提到了第三种就是混杂模式),我们就先看前两种:第一种是解题模式,解题模式的话其实比较好理解,给我们一道题目去做一个解答。参赛人员可以通过线上或线下去解出一个题目,解出题目后,你会拿到一个叫做flag的一个东西,那么你就要去提交这个flag,如果你的flag是正确的你就会得分,类似于常规竞赛。很多比赛中如果你是前三名,比如说拿到一血二血三血这样子,你会有一个额外的一个加分;也会有其他的赛制,一道题目解出的人越多得分值就会越低(可以理解为解出的人多题就简单嘛)。 第二种攻防模式,攻防模式指参赛队伍在整个网络环境中做相互的攻防,每个队伍它都会拿到一台属于他们自己的服务器。首先你要对它做一个加固,因为其他队伍会来攻击你的服务器,如果攻击成功他们就会做一些操作,如果顺利可能获得一个flag,那么他们就得分,所以你要给自己的服务器做好防守,同时你也可以根据上述流程去攻击别人的服务器,获得flag。百度百科上提到的第三种是混杂模式,其实就是先解题得基础分,然后再进行攻防。但是实际比赛中,会有各种各样的需求,还有防守形式,那种的话就像是谁先攻占,谁先防守,然后看看时间长短。还有一种是每人一台服务器,我们做攻击,看对方的加固,目前国内还有一种工控形式的比赛。 给你一套正常的一套类似现实中的工控环境,对它进行渗透获取flag,这种会更有趣一点。相信在之后CTF的赛制规则会越来越多,越来越有趣。 关于比赛规则 比赛的时间周期可长可短,长的有48小时短的可能几个小时,比赛中时间会刷新,比如我有一个漏洞,按道理来说我们刷到一个漏洞,可以一直利用下去,那就可以一直得分了,其实并不是这样子的,它有个轮数限制,每一轮我设置成5分钟或者15分钟,你在一个目标服务器上,在规定时间内只能得一次分,过了这十分钟之后,那么你才能进行第二次得分,这种竞争就会非常的激烈,每一分每一秒你都你都有可能被人超过,或者你都有可能去超过别人。 如果你发现一个别人都没有补过的漏洞,那你就可以会全拿整个分数。 比赛的规则很多样,如果你把别人的服务器宕机掉了,在一些规则中是要扣分的。你即使不得分,你也会让别人失分,变相的会建立一些优势。 有些比赛中会检测CPU的使用率,如果服务器比较卡顿,会被认定该服务器不能正常服务,就会减分,所以说整个比赛中规则很多样,没有具体的非常标准化的规则,因比赛而异。 题型:1、MISC属于杂项,比如说你不知道该怎么分的时候,你就把它往杂项里丢。常规杂项包括哪些类型呢?首先第一个就是我们常说的隐写术,就是信息隐藏技术信息隐藏的话,你可以把信息隐藏在很多的东西中,比如说图片文件音频视频等等一系列都是可以的,然后你要通过非常多的技术手段分析,或者说配合工具的一些使用,去找到你要的一些消息,去获取到这样的一个flag。 2、PPCPPC是一个编程类的,编程类的话就比如说就像之前前段时间有个五子棋比赛,你要把他下赢了才能够拿分,那你要么可以自己下,把它下赢也是没问题的;要么你就可以自己去写一个编程机器人去跟他做个对抗,去赢得比赛;通过编程来实现打分的形式,这种题目不会非常多的。 3、CRYPTOCRYPTO是密码学的题型,给你一串密文,去猜它使用了哪些加密方式,提取出你需要拿到的那个flag就可以。 4、REVERSEREVERSE是逆向的,对windows或者Linux的一个破解,这里的话因为现在移动安全也比较火,那么现在还会有衍生出来非常多的移动安全的题目,就类似安卓逆向等等。 5、PWN基于程序的一个逻辑分析 6、WEB我们就是常见的web狗,CTF鄙视链的低端(哈哈哈哈哈),web的题型就非常多啦。 CTF赛事介绍 DEFCON CTF (CTF赛事中的 “世界杯”,往年都是美国夺冠,去年是韩国的战队) 日本的SECCON赛题也非常的难 XCTF全国联赛 其他各种赛事 除了国际赛的话,国内也有很多,比如说XCTF就是它的全国联赛,它有一站一站可以打过去。然后除了这些知名赛事之外,其实还有很多那种小赛事,你也别小看它,其实很多题目也都挺有意思的。这些题少,但是也可以去关注一下。 我们会先去找一些网上可以访问到的题目来做,之后各种考点都讲完了,会把这点混在一起,去找一些那种国际事国际赛事,或者是国内知名赛事,就相对来说难度大一些的,或者说是一些他们交流的,交就会内部交流的一些题目,或者说还有那种就是某些爱好者自己放出了一个挑战赛之类的这种题型,会拿出来给大家做一个分享。 下面给大家推荐2个网站: 第一个地址会介绍国内国际上的要举行的一些CTF赛事的一些时间等等信息,一些战队的一些排名,像刚提到的SECCCON日本的黑客大会,都可以去了解一下。ctftime.org是对一个在国际上比较重要的赛事的做一些记录,而且会还会给出赛事的一些权重,以及对这种CTF知名战队的一些排名,就可以去了解一下。要提升自己的实力,开始入门尝试去找一些能够上手去练习的地方。因为其实如果一开始你直接去打各种比赛,都做不出来就很受打击,所以的话一开始的练习是非常重要的。那么这里就减给了一些那种你能够去练习的一些站点,如果说技术不太好的话,可以都看一看,都上手去试一试。 宽字节注入 首先对sql注入做一个系列的课程讲解。它是一个系列,因为它内容涉及非常多,就会一点一点地讲下去。一开始我先会讲关于一个宽字节的一个注入,因为宽字节相对来说比较简单,同时也就是即使你不会在这个地方你通过对宽字节注入的了解,你也大致能够了解基本注入的一个方式。提到宽字节注入就要提到一些常见的编码方式,比如第一个ASCII,我们看下这张表: 它是从0到127的,那么其实就是阿斯克码表中,它会认为这种比如说字符调入url编码,一般来说它这种字母什么的,可能就是你在传输过程中,你会发现它不是进行编码的。因为它这种小于128的,会认为这是一个单单个的一个字。但是我们知道如果我们在传说一个中文的时候,比如说你在网页网址中去输个中文,这个中文很多时候都会变成一个百分号开头的一串的一个字符串,其实就是相当于就要做一个转码的形式。针对一个GBK的注入使用,GBK是关于中文的一个编码,但这个GBK库其实是不全的。 我们先看一下对url转码的一个问题: 比如说我们去使用hackbar(它是基于火狐浏览器的一个插件),你会发现里面除了空格之后,你再去发出请求,你再回过头去看url,就是地址栏的时候,你会发现这个空格都会变成一个%20,它其实就是对这个东西做了一个url编码。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作 CTF从入门到提升 课时1 18分10秒) 对某些符号的url编码其实要有要稍微要敏感一些,比如说空格在编程编之后就会变成一个%20,然后‘ 就更加要去重注意这个地方。为什么这样说?我们知道在注入的时候有一个很重要的一个问题,我们不去输入一个’,那么我们输入的内容是无法逃逸出对引号之间的,即使你这种时候去输再多的语句也是没有任何意义的。 所以说你对单引号要敏感一些。因为单引号中很重要,比如说像还有双引号这种,因为它有可能能够帮助你去逃逸,有的就是它把你限制死的框中,然后#2%#3%也很重要,因为什么?#就是我们常的一个注释符对吧?这里我们把%5C拿出来,因为这里就要提到一个这个函数,这函数可以简单的看一下: 这个地方截图是来自于php.net官方手册上的一个截图。上图它给的是一个当前函数知识的版本好。然后没有后面的话,如果讲到关于php的代码审计的一些问题的时候,就经常会去看这个手册,因为这些有些函数它其实它的问题是存在于某些版本之中的,或者说某某相人术它在某些版本中是弃用的,所以像这种地方可以多去关注一下。 下面就给了一个简单说明,它的就是说它会返回一个字符串,你可以看到它该字符串就是为了数据库查询语句,等待需要某些字符串,字符前加上反斜线。它提到的这些符号就是第一个是' ",然后\,还有一个的'?你要知道加上\的一个作用,加上\之后,'就会变成加'全部加上一个\,那么\其实起到的就是一个转移作用,'就是它就会变成它是个',但是它只有长的是个'样,但是没有'在代码中的一个作用,那么这段以后就会失去它本身的一个作用,它只是看成你能看到它',但是不能去实现一个注入的功能。 那么这个函数的话,其实你看它这么简单,但是其实很多这种php库中很多的使用的调用的第三方代码库,它其实都是基于这个函数做的二次开发封装之后的一个调用,就说它的本质还是使用了这个函数的。那么我们是接下来重点就是说如何从这个函数中去逃逸出来,我们因为他这个函数存在,我们就无法去插入一个' "无法插入',"的时候,我们就无法去实现语句的执行,因为我们数据都在引号之中,它会把我们所有的东西都当成字符串去做一个查询的。 这里给两种思路: 第一个,要么在前面\再去加一个\,那么\就把\给转移掉。那么‘是不是就生效了。那么或者第二种思路就是’,好想办法把它给弄没掉去,因为这样‘不见了的话,那么不是’,就是反其先给弄没掉去,那么这样的话单引号就会生效了。所以就基于这两种树就要去做一个操作。这里提到了这宽字节,刚才是不是提到\其实是%5C。 之前一开始我就讲到说你比如说你输一个中文,你会在地址栏中发现它会变成一串%一个形式。那么但是我们其实知道%一串东西,它本意其实是一个汉字,那么GBK它用的就是这样一种形式,用\去和我们去数我们所有的东西,去重新构成一个汉字。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作) 它这地方是不是就给了一个‘?然后’在前面去加个\,它其实就是%5C%27。因为这是url转码之后的。但是像下面这个地方,我就给出了一个%df%5C%27,那么它的转码之后是不是就经过那个函数过滤之后,是不是会在‘去加个反斜线,那么它其实就会变成三个字符。像GB K的问题,它就是把两个%开头的这种认为是一个汉字,而且我之前提到过,就对于阿斯科码128的一个,他就会认为他不是一个符号,他就会认为这两个拼接在一起才是一个,他就不会把它认为单一符号,而且级PK是两一个两个两两个自己认为一个是一个汉字,那么他就会把%5C然后把%DF和800分和5C去拼接在一起,作为一个汉字来识别。那么这样的评级在一起之后,51%是不就不见了,51%它其实就是反切线,那这个时候分二期他就会逃逸出来,去达到一个逃逸的效果。我们可以看一下它的一个效果。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作) 比如说像这个地方,它是一个网在线转码工具,我还是在这个地方去输一个,比如说中文你好,我对他做一个url解码,因为GBK的我要把它换成做个编码之后,你会看到%C4%E3是两位的。那么按照我刚才的说法,是不是单引号会加,他做个编码的形式的话,我要做的是在单引号去前面去加个%DF我这时候再做个解码的时候,他会把这两个认为是一个汉字,做一个解码,你会看到这个时候,它把它认为一个汉字的时候,那么就是会变成这么一个字,这时候单引号就做出了一个逃逸。你要注意到这个时候,GBK编码其实是由于数据库,它是使用GBK编码的,要不然的话,因为他查询的时候是把它其实会直接把%DF和’去直接插入到数据库里的,而不是说是因为前面的就在前端的一个执行,是因为它经过数据库的一个执行,然后或者说我们可以简单的去看一下。 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作) 比如说就说本地做的环境,这个环境其实是用之前很早的时候用的一个环境,它这个地方它的注入点是?如果说我在单引号它是没有效果,我去加个%df的时候,它其实就会报错。它实际去抄到数据库中去执行那个东西,这是非常老的一个工具,但是挺好用的。我在去执行一下,我对它做一个可能性。因为看到这个时候是不是,X其实就是类似我们这个地方的一个%,就代表其实就是%df,因为其实这个df代表是16进制,X代表其实就是16进制编码。然后X和df就会和反切像组成一个字去实现一个查询。这个其实就是对宽字节的一个基本原理。 举例 (在这里我做一个演示,如果大家想看可以到安全牛课堂的视频里看动手操作,CTF从入门到提升 课时1 28分10秒处) 拿一个简单的例题来看一下,这个题目其实应该是南邮训练平台的一道题目。那么我们可以整个过程来看一下,到底是怎么来做这种题目,因为这种的话只是为了简单,先让我们回顾一下SQL注入这些问题,后面会越来越深入了解讲讲。首先的话,其实你知道我们目的是要去杀插入的单引号,因为它这个地方给出了我们这个语句,可以说这个语句。那么我先插入一个单引号,它是没有用的。反斜线就用刚才说的加了几个加上%df去实现。然后其实刚才提到一个点,是不是不是针对%df其实只要大于128其实就可以了,比如说A可以看一下到底行不行。你会发现A其实也是可以的,其实证明刚才说的是没有问题的。那么这样子可以之后,那么就要去做进一步的注入。其实动画之后你会发现,其实也没有说如果说是这么顺利的可以坐下来,比如说你接下来就是要首先去跟一个单引号的话,配合上之后要去做一个#。他后面东西今后你发现它都是不报错了,之前去判断一下,看一下对不对。这就是没有生效,他这样才是有用,所以这道题到就黑开发的一个使用,很多时候就要去做一个转码,要不然它其实是会有问题的。而且其实要拖到转板这个问题,就不同的版本还可其实作用又不一样,像我这边的浏览器是新版火狐,像我在这个里面是旧版火狐,又会有一些简单的一些差异。你会发现其实就是输出点,那么首先去查data base,这是它的当前的一个数据库。 要了解的话可以去网上去看一下,因为它只是基于数据库my circle数据库本身的一些自带的一些库,它会记录下来那些其他的一些库的信息,所以通过去查这个库中库中的某些表的数据,就可以去拿到一些数据,那么放他的条件是推波。贴宝贝CHCHE那么等于按道理来说,这个时候其实应该是不是要去说一个库名,如果像你这样的话,可以去说,可以试试看。因为发现这个时候,它会在单以后去前面再去加一个反斜线。 这样的话其实这个地方就会就出现问题了,那么其实这个地方的引号其实是不能去使用的。那么这个地方的话,第一种方法你可以用他的全具备用去代替。DATABSC在特别是去做一个大T你会看到这时候存在一种数据表示CTF对吧?除了CTF之外,它会不会其他表呢?可以试看。Q友看那就是ct FCDFCP3CPACF这么多的表,其实我也不知道他是哪张表,是答案所在,其实也无所谓,主要是为了掩饰整个的一个注入过程。那么这样的话其实就说明我们能够拿到你们的数据表,那么接下来他就是我就假设,比如说要CTF这张表,我只是随便举例子,不一定把它做完,就是讲解这么一个方法。
俗话说"三分技术七分管理" 目前组织普遍采用现代通信、计算机、网络技术来构建组织的信息系统。但大多数组织的最高管理层对信息资产所面临的威胁的严重性认识不足,缺乏明确的信息安全方针、完整的信息安全管理制度、相应的管理措施不到位,如系统的运行、维护、开发等岗位不清,职责不分,存在一人身兼数职的现象。这些都是造成信息安全事件的重要原因。缺乏系统的管理思想也是一个重要的问题。所以,我们需要一个系统的、整体规划的信息安全管理体系,从预防控制的角度出发,保障组织的信息系统与业务之安全与正常运作。 信息安全管理体系标准发展历史 目前,在信息安全管理体系方面,ISO/IEC27001:2005--信息安全管理体系标准已经成为世界上应用最广泛与典型的信息安全管理标准。ISO/IEC27001是由英国标准BS7799转换而成的。BS7799标准于1993年由英国贸易工业部立项,于1995年英国首次出版BS 7799-1:1995《信息安全管理实施细则》,它提供了一套综合的、由信息安全最佳惯例组成的实施规则,其目的是作为确定工商业信息系统在大多数情况所需控制范围的参考基准,适用于大、中、小组织。2000年12月,BS7799-1:1999《信息安全管理实施细则》通过了国际标准化组织ISO的认可,正式成为国际标准----- ISO/IEC17799:2000《信息技术-信息安全管理实施细则》,后来该标准已升版为标准版。 ISO27001 标准要求的ISMS 文件体系应该是一个层次化的体系,通常是由四个层次构成的: 信息安全手册:该手册由信息安全委员会负责制定和修改,是对信息安全管理体系框架的整体描述,以此表明确定范围内ISMS 是按照ISO27001 标准要求建立并运行的。信息安全手册包含各个一级文件。 一级文件:全组织范围内的信息安全方针,以及下属各个方面的策略方针等。一级文件至少包括(可能不限于此):信息安全方针风险评估报告适用性声明(SoA) 二级文件:各类程序文件。至少包括(可能不限于此):风险评估流程风险管理流程风险处理计划管理评审程序信息设备管理程序信息安全组织建设规定新设施管理程序内部审核程序第三方和外包管理规定信息资产管理规定工作环境安全管理规定介质处理与安全规定系统开发与维护程序业务连续性管理程序法律符合性管理规定信息系统安全审计规定文件及材料控制程序安全事件处理流程。 三级文件:具体的作业指导书。描述了某项任务具体的操作步骤和方法,是对各个程序文件所规定的领域内工作的细化。 四级文件:各种记录文件,包括实施各项流程的记录成果。这些文件通常表现为记录表格,应该成为ISMS 得以持续运行的有力证据,由各个相关部门自行维护。 ISO27001的3个内容: 11个控制领域 39个控制目标 133个控制措施 ISO27001是内外合规中的一个案例,信息安全从业者需掌握组织建设所需的合规性的相关要求及执行要点;企业满足政府的监管要求,有效地提升组织的管理能力。内容参考 安全牛课堂《信息安全合规性》第四章 行业的标准规范。 另附一份27001的思维脑图:
假设,有一张大小为32×32×3的输入图片,这是一张RGB模式的图片,你想做手写体数字识别。32×32×3的RGB图片中含有某个数字,比如7,你想识别它是从0-9这10个数字中的哪一个,我们构建一个神经网络来实现这个功能。 我用的这个网络模型和经典网络LeNet-5非常相似,灵感也来源于此。LeNet-5是多年前Yann LeCun创建的,我所采用的模型并不是LeNet-5,但是受它启发,许多参数选择都与LeNet-5相似。输入是32×32×3的矩阵,假设第一层使用过滤器大小为5×5,步幅是1,padding是0,过滤器个数为6,那么输出为28×28×6。将这层标记为CONV1,它用了6个过滤器,增加了偏差,应用了非线性函数,可能是ReLU非线性函数,最后输出CONV1的结果。 然后构建一个池化层,这里我选择用最大池化,参数$f=2$,$s=2$,因为padding为0,我就不写出来了。现在开始构建池化层,最大池化使用的过滤器为2×2,步幅为2,表示层的高度和宽度会减少一半。因此,28×28变成了14×14,通道数量保持不变,所以最终输出为14×14×6,将该输出标记为POOL1。 人们发现在卷积神经网络文献中,卷积有两种分类,这与所谓层的划分存在一致性。一类卷积是一个卷积层和一个池化层一起作为一层,这就是神经网络的Layer1。另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。这里,我们把CONV1和POOL1共同作为一个卷积,并标记为Layer1。虽然你在阅读网络文章或研究报告时,你可能会看到卷积层和池化层各为一层的情况,这只是两种不同的标记术语。一般我在统计网络层数时,只计算具有权重的层,也就是把CONV1和POOL1作为Layer1。这里我们用CONV1和POOL1来标记,两者都是神经网络Layer1的一部分,POOL1也被划分在Layer1中,因为它没有权重,得到的输出是14×14×6。 我们再为它构建一个卷积层,过滤器大小为5×5,步幅为1,这次我们用10个过滤器,最后输出一个10×10×10的矩阵,标记为CONV2。 然后做最大池化,超参数$f=2$,$s=2$。你大概可以猜出结果,$f=2$,$s=2$,高度和宽度会减半,最后输出为5×5×10,标记为POOL2,这就是神经网络的第二个卷积层,即Layer2。 如果对Layer1应用另一个卷积层,过滤器为5×5,即$f=5$,步幅是1,padding为0,所以这里省略了,过滤器16个,所以CONV2输出为10×10×16。我们看看CONV2,这是CONV2层。 继续执行做大池化计算,参数$f=2$,$s=2$,你能猜到结果么?对10×10×16输入执行最大池化计算,参数$f=2$,$s=2$,高度和宽度减半,计算结果猜到了吧。最大池化的参数$f=2$,$s=2$,输入的高度和宽度会减半,结果为5×5×16,通道数和之前一样,标记为POOL2。这是一个卷积,即Layer2,因为它只有一个权重集和一个卷积层CONV2。 5×5×16矩阵包含400个元素,现在将POOL2平整化为一个大小为400的一维向量。我们可以把平整化结果想象成这样的一个神经元集合,然后利用这400个单元构建下一层。下一层含有120个单元,这就是我们第一个全连接层,标记为FC3。这400个单元与120个单元紧密相连,这就是全连接层。它很像我们在第一和第二门课中讲过的单神经网络层,这是一个标准的神经网络。它的权重矩阵为$W^{\left\lbrack 3 \right\rbrack}$,维度为120×400。这就是所谓的“全连接”,因为这400个单元与这120个单元的每一项连接,还有一个偏差参数。最后输出120个维度,因为有120个输出。 然后我们对这个120个单元再添加一个全连接层,这层更小,假设它含有84个单元,标记为FC4。 最后,用这84个单元填充一个softmax单元。如果我们想通过手写数字识别来识别手写0-9这10个数字,这个softmax就会有10个输出。 此例中的卷积神经网络很典型,看上去它有很多超参数,关于如何选定这些参数,后面我提供更多建议。常规做法是,尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,那么它也有可能适用于你自己的应用程序,这块下周我会细讲。 现在,我想指出的是,随着神经网络深度的加深,高度$n{H}$和宽度$n{W}$通常都会减少,前面我就提到过,从32×32到28×28,到14×14,到10×10,再到5×5。所以随着层数增加,高度和宽度都会减小,而通道数量会增加,从3到6到16不断增加,然后得到一个全连接层。 在神经网络中,另一种常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax。这是神经网络的另一种常见模式。 接下来我们讲讲神经网络的激活值形状,激活值大小和参数数量。输入为32×32×3,这些数做乘法,结果为3072,所以激活值$a^{[0]}$有3072维,激活值矩阵为32×32×3,输入层没有参数。计算其他层的时候,试着自己计算出激活值,这些都是网络中不同层的激活值形状和激活值大小。 有几点要注意,第一,池化层和最大池化层没有参数;第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。 神经网络的基本构造模块我们已经讲完了,一个卷积神经网络包括卷积层、池化层和全连接层。许多计算机视觉研究正在探索如何把这些基本模块整合起来,构建高效的神经网络,整合这些基本模块确实需要深入的理解。根据我的经验,找到整合基本构造模块最好方法就是大量阅读别人的案例。 以上内容参考安全牛课堂 机器学习与网络安全 第4章节 卷积神经网络
今天继续分享卷积神经网络,常常用深度学习这个术语来指训练神经网络的过程,有时它指的是特别大规模的神经网络训练。那么神经网络究竟是什么呢?我们先来看一些直观的基础知识。 让我们从一个房价预测的例子开始讲起。 假设你有一个数据集,它包含了六栋房子的信息。所以,你知道房屋的面积是多少平方英尺或者平方米,并且知道房屋价格。这时,你想要拟合一个根据房屋面积预测房价的函数。 如果你对线性回归很熟悉,你可能会说:“好吧,让我们用这些数据拟合一条直线。”于是你可能会得到这样一条直线。 但有点奇怪的是,我们知道价格永远不会是负数的。因此,为了替代一条可能会让价格为负的直线,我们把直线弯曲一点,让它最终在零结束。这条粗的蓝线最终就是我们要的函数,用于根据房屋面积预测价格。有部分是零,而直线的部分拟合的很好。你也许认为这个函数只拟合房屋价格。 作为一个神经网络,这几乎可能是最简单的神经网络。我们把房屋的面积作为神经网络的输入(我们称之为$x$),通过一个节点(一个小圆圈),最终输出了价格(我们用$y$表示)。其实这个小圆圈就是一个单独的神经元。接着网络实现了左边这个函数的功能。 在有关神经网络的文献中,经常能看得到这个函数:从趋近于零开始,然后变成一条直线。这个函数被称作ReLU激活函数,它的全称是Rectified Linear Unit。rectify(修正)可以理解成$max(0,x)$,这也是你得到一个这种形状的函数的原因。 你现在不用担心不理解ReLU函数,你将会在这门课的后面再次看到它。 如果这是一个单神经元网络,不管规模大小,它正是通过把这些单个神经元叠加在一起来形成。如果把这些神经元想象成单独的乐高积木,就可以通过搭积木来完成一个更大的神经网络。 让我们来看一个例子,我们不仅仅用房屋的面积来预测它的价格,现在你有了一些有关房屋的其它特征,比如卧室的数量,或许有一个很重要的因素,一家人的数量也会影响房屋价格,这个房屋能住下一家人或者是四五个人的家庭吗?而这确实是基于房屋大小,以及真正决定一栋房子是否能适合你们家庭人数的卧室数。 换个话题,你可能知道邮政编码或许能作为一个特征,告诉你步行化程度。比如这附近是不是高度步行化,你是否能步行去杂货店或者是学校,以及你是否需要驾驶汽车。有些人喜欢居住在以步行为主的区域,另外根据邮政编码还和富裕程度相关(在美国是这样的)。但在其它国家也可能体现出附近学校的水平有多好。 在图上每一个画的小圆圈都可以是ReLU的一部分,也就是指修正线性单元,或者其它稍微非线性的函数。基于房屋面积和卧室数量,可以估算家庭人口,基于邮编,可以估测步行化程度或者学校的质量。最后你可能会这样想,这些决定人们乐意花费多少钱。 对于一个房子来说,这些都是与它息息相关的事情。在这个情景里,家庭人口、步行化程度以及学校的质量都能帮助你预测房屋的价格。以此为例,$x$ 是所有的这四个输入,$y$ 是你尝试预测的价格,把这些单个的神经元叠加在一起,我们就有了一个稍微大一点的神经网络。这显示了神经网络的神奇之处,虽然我已经描述了一个神经网络,它可以需要你得到房屋面积、步行化程度和学校的质量,或者其它影响价格的因素。 神经网络的一部分神奇之处在于,当你实现它之后,你要做的只是输入$x$,就能得到输出$y$。因为它可以自己计算你训练集中样本的数目以及所有的中间过程。所以,实际上要做的就是:这里有四个输入的神经网络,这输入的特征可能是房屋的大小、卧室的数量、邮政编码和区域的富裕程度。给出这些输入的特征之后,神经网络的工作就是预测对应的价格。同时也注意到这些被叫做隐藏单元圆圈,在一个神经网络中,它们每个都从输入的四个特征获得自身输入,比如说,第一个结点代表家庭人口,而家庭人口仅仅取决于$x_1$和$x_2$特征,换句话说,在神经网络中,你决定在这个结点中想要得到什么,然后用所有的四个输入来计算想要得到的。因此,我们说输入层和中间层被紧密的连接起来了。 值得注意的是神经网络给予了足够多的关于$x$和$y$的数据,给予了足够的训练样本有关$x$和$y$。神经网络非常擅长计算从$x$到$y$的精准映射函数。 这就是一个基础的神经网络。你可能发现你自己的神经网络在监督学习的环境下是如此的有效和强大,也就是说你只要尝试输入一个$x$,即可把它映射成$y$,就好像我们在刚才房价预测的例子中看到的效果。 以上内容参考安全牛课堂 机器学习与网络安全 第4章节 卷积神经网络
计算机视觉(Computer vision)深度学习与计算机视觉可以帮助汽车,查明周围的行人和汽车,并帮助汽车避开它们。还使得人脸识别技术变得更加效率和精准,我们可以体验到通过刷脸就能解锁手机或者门锁的便捷。当你解锁了手机,手机上一定有很多分享图片的应用。在上面,可以看到美食,酒店或美丽风景的图片。有些公司在这些应用上使用了深度学习技术来向大家展示最为生动美丽以及与我们最为相关的图片。机器学习甚至还催生了新的艺术类型。 首先,计算机视觉的高速发展标志着新型应用产生的可能,这是几年前,人们所不敢想象的。通过学习使用这些工具,可以创造出新的产品和应用。 其次,即使到头来未能在计算机视觉上有所建树,但人们对于计算机视觉的研究是如此富有想象力和创造力,由此衍生出新的神经网络结构与算法,这实际上启发人们去创造出计算机视觉与其他领域的交叉成果。 图片分类(图片识别) 比如给出这张64×64的图片,让计算机去分辨出这是一只猫。 还有一个例子,在计算机视觉中有个问题叫做目标检测,比如在一个无人驾驶项目中,你不一定非得识别出图片中的物体是车辆,但你需要计算出其他车辆的位置,以确保自己能够避开它们。所以在目标检测项目中,首先需要计算出图中有哪些物体,比如汽车,还有图片中的其他东西,再将它们模拟成一个个盒子,或用一些其他的技术识别出它们在图片中的位置。注意在这个例子中,在一张图片中同时有多个车辆,每辆车相对与你来说都有一个确切的距离。 还有一个更有趣的例子,就是神经网络实现的图片风格迁移,比如说你有一张图片,但你想将这张图片转换为另外一种风格。所以图片风格迁移,就是你有一张满意的图片和一张风格图片,实际上右边这幅画是毕加索的画作,而你可以利用神经网络将它们融合到一起,描绘出一张新的图片。它的整体轮廓来自于左边,却是右边的风格,最后生成下面这张图片。这种神奇的算法创造出了新的艺术风格,所以在这门课程中,你也能通过学习做到这样的事情。 但在应用计算机视觉时要面临一个挑战,就是数据的输入可能会非常大。举个例子,在过去的课程中,你们一般操作的都是64×64的小图片,实际上,它的数据量是64×64×3,因为每张图片都有3个颜色通道。如果计算一下的话,可得知数据量为12288,所以我们的特征向量$x$维度为12288。这其实还好,因为64×64真的是很小的一张图片。 如果你要操作更大的图片,比如一张1000×1000的图片,它足有1兆那么大,但是特征向量的维度达到了1000×1000×3,因为有3个RGB通道,所以数字将会是300万。如果你在尺寸很小的屏幕上观察,可能察觉不出上面的图片只有64×64那么大,而下面一张是1000×1000的大图。 如果你要输入300万的数据量,这就意味着,特征向量$x$的维度高达300万。所以在第一隐藏层中,你也许会有1000个隐藏单元,而所有的权值组成了矩阵 $W^{[1]}$。如果你使用了标准的全连接网络,就像我们在第一门和第二门的课程里说的,这个矩阵的大小将会是1000×300万。因为现在$x$的维度为$3m$,$3m$通常用来表示300万。这意味着矩阵$W^{[1]}$会有30亿个参数,这是个非常巨大的数字。在参数如此大量的情况下,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含30亿参数的神经网络,巨大的内存需求让人不太能接受。 但对于计算机视觉应用来说,你肯定不想它只处理小图片,你希望它同时也要能处理大图。为此,你需要进行卷积计算,它是卷积神经网络中非常重要的一块。 以上内容参考安全牛课堂 机器学习与网络安全 第4章节 卷积神经网络