SQL注入
SQL注入
- 假设你用自己的用户名和密码登录了一个付费网站,服务器需要查询一下你是不是VIP用户。服务器通常都是会向数据库进行查询的,因为服务器把用户数据都放在数据库里面了,要向数据库进行增加,删除,修改和查询这些操作就需要用到SKU这种语言了。
- 但问题是,如果黑客没有正常输入数据,而是把数据转换成代码,使得服务器像数据库的正常查询变成了不正常的代码执行。那么黑客就可以执行自己想要的操作了。
报错与注释
- SQL的语法就很像正常的英语,比如说这里有一个保存在数据库的用户名、密码表格,如果我们要选取表格里面的所有内容,就可以用select * from。如果我们要选取指定的用户名和密码,就可以在后面加上where,并且附上条件。
- 假设用户输入了用户名和密码后,服务器就会把输入的用户名和密码这两条数据加在where语句里面,看起来是一个正常的操作。
- 但是服务器如果没有过滤用户输入的数据,比方说黑客在用户名最后加上一个单引号,SQL查询语句就会变成这样
- 那当SQL执行这条语句的时候,会把一对引号里面的视为字符数据,而不是操作符。因为这里的引号不成对,因此这条SQL语句是会报错的,如果此时服务器傻的把sql报错的信息直接返回给用户,那么黑客就知道具体是什么原因导致报错了。SQL注入攻击的门就这样被打开了。
- 如果在单引行后面加上两横,事情就不一样了,如果在MySQL里面系统遇到这两条横线就会认为从这里开始到这一行结束都是注释,是不会被视为代码进行执行的,注释一般是用来给代码进行解释说明的文字,那相当于只会执行前面部分的SKU语句。如果黑客知道用户名及时不知道密码,也可以进行账号的登录了。
- 如果连正确的用户名信息都没有,那么
- SQL语句在遇到where关键词的时候会判断条件是真还是假。因为如果一个条件为真,另一个条件为假,用or来把这两个条件拼接起来,那么得到的就是真,也就是说一个只需要再增加一个为真的条件就行了。
- 比如1=1,因为1肯定是等于1的,所以条件为真,即使用户信息错误,where这里的逻辑判断都是为真,因为这里是or,或者这样的逻辑。
UNION
- 在sql里要合并两个表格的内容,常见的就是用union操作符来连接两个select语句。
- 但是union是可以有骚操作的,比如在MySQL里union select的后面可以不需要指定表格名字,直接在select后面用null来代替列名。
- null是一个特殊的值,表示没有值。这个操作看似没什么意义,因为就直接把两个null合并在表格里一起进行展示。
- 但是union的操作必须保证合并两边的列数是要一致的,一般是不知道表格有多少列的,但可以一直在后面加上null来测试,最后多少个null是返回成功的结果,就证明这表格有多少列了。
- 如果现在黑客用其他方法知道了另一个表格的信息,那就可以把表格的列名放在null的位置,并且指定选取的表格名。
- union除了要保证列数一致以外,还要保证数据类型要相似。实际上黑客在确定好列数以后,还会进行数据类型的判断,比如逐列进行测试就行了。
- 现在黑客就可以把所有的东西都放在一起。首先在可以注入的地方用单引号强行终止数据内容,并且加上注释关键词,使得后面的语句失效,这样SQL语句就不会报错,黑客就可以在这里注入union语句了。
布尔和时间延迟
- 现在大部分网站都会使用cookie,这样服务器就能根据不同cookie来识别不同的用户,从而展示不同的网页内容。
- 也就是说,通常会在数据库保存不同用户的cookie用户登录网页的时候,就会在HTTP请求里面加上Cookie这个HTTP首部。相应的也会生成服务器向数据库的查询语句,比方说select from where。
- 此时黑客就可以使用前面说到的方法,在这里修改cookie的值,强行加上一个单引号来结束字符数据,并且注释掉后面的SQL语句。
- 如果此时返回的还是原来的页面,证明是可以被注入。
- 但是,如果我们在后面加上一个条件,故意使where语句变错,因为1肯定不等于0,加上这里我们用and来进行逻辑判断,如果有一个条件错误,也就是查询不到要查询的内容。
- 如果此时返回的页面内容改变了,那么黑客就知道查询到内容时是什么页面,查询不到内容又是什么页面。
- 那现在只需要修改and后面这个条件就能猜测到想要的内容了。
- 比方说可以把第二个条件改成这样,使用substring方法进行判断,判断mima这个字符串的第一个字符是否为字符m?
如果是,那么就返回正常的用户页面。
如果不是,那么就会返回不一样的用户。 - 此时,如果黑客知道网站管理员的账号是admin,并且账号密码都保存在users这个表里面,那就可以在这里做文章了,因为黑客可以把substring里的第一个参数修改为一条查询语句,接下来只需要不断发送请求,不断修改判断的字符,返回正确的页面就证明猜中了密码的第一个字符,然后就换为猜第二个字符。一直这样用暴力破解的方式得到管理员的密码,所以这种==布尔注入==的方式其实属于盲注。
- 盲注还有另一种常见的方式就是用==延时的方式进行判断==,一般会用sleep这个函数。
- 比方说设置10秒,那如果页面在10秒左右返回的内容就是猜中,如果页面正常时间返回,而且在10秒内,那就是没猜中。
- 但是如果网站服务器不返回内容到页面也没有不同的页面来判断查询是否成功,千万不要以为网站就安全了,只要黑客可以向网站服务器发送正常的请求,并且服务器会向数据库进行沟通,就可能会产生漏洞。
- 比如像MySQL系统注入load_fire()函数,如果给这个函数提供域名,那么就会触发DNS查询,也就是查询域名的IP地址,这个时候虽然服务器不返回内容给黑客,但是服务器还是会进行SQL查询。
- 此时如果黑客做了手脚,把要查询的管理员密码和域名进行拼接,相当于直接把管理员密码发给了黑客,因为黑客的服务器是自己控制的,因此黑客可以查看DNS查询的内容,此时就可以把管理员密码给提取出来。
XSS网络攻击
反射型XSS
- 骗子就如同网络黑客受害者就如同用浏览器上网的用户,银行就如同网站的服务器。
- 首先,骗子精心制作了一条网页链接,也就是网页URL,并且发送给用户。
- 接着用户使用浏览器输入URL浏览器就会去访问这个网站。
- 服务器查看了链接以后以为用户想要检索某些信息而已,并没有进行额外的过滤。
- 服务器的数据库也不需要保存什么信息就直接返回了对应的结果,浏览器就会把结果呈现到页面。
- 问题是黑客给的URL里面是存在额外的操作,比如把用户浏览器的一些隐私发送给黑客,只要用户一点击链接就中招了。
- 流程总结:
- 1.黑客URL
- 2.用户检索信息
- 3.服务器无过滤,不保存
- 4.服务器反射信息
- 5.执行脚本
- 反射型XSS一般是利用网页的检索功能,比方说b站搜索,你搜索的关键词会体现在uri里,服务器会根据URL反射回来展示在你的页面里。
- 换句话说,你的URL的其中一部分被展示在页面里,如果b站的服务器没有对检索的URL进行过滤,
- 刚好URL里含有恶意的代码,那么恶意的代码就会被植入到你的页面里面。
存储型XSS
- 存储型的xss一般会发生在可以发表评论的网站。
- 黑客不发表正常的评论,而是把恶意代码脚本作为评论发送给网站服务器。如果服务器不进行过滤,就会把评论永久保存起来。常见的就是保存在数据库里面。
- 特点:
- 1.黑客URL
- 2.服务器无过滤,并且保存。
- 3.用户正常访问
- 4.返回页面。
- 5.执行脚本
- 问题是每个浏览这个网站的用户都会看到所有评论,也就是会被迫看到有恶意代码的评论.
- 看到恶意代码的同时,浏览器就会自动执行恶意代码,可能会把你的信息泄露给了黑客,也可能执行的脚本是为黑客赚钱的.
- 用户并不是因为点击乱七八糟的URL中招,而是在你访问网站评论区的时候就自动中招了。
- 比如b站允许用户发送弹幕和评论,如果服务器不过滤,用户发送的恶意信息,这些信息就会实时的保存在b站服务器里,只要有用户访问当前的视频页面就中招,直到服务器那边把恶意代码删除为止。
DOM型XSS
- 黑客会制作一条链接给你点击,你点击以后浏览器并未把恶意代码脚本发送给服务器,或者恶意代码暂未执行。服务器此时并不知情,只是把正常的网页源码发送给浏览器。
- 首先渲染网页源码,接着把刚才会执行的恶意代码也给执行了。
- 简单总结:
- 1.黑客URL
- 2.浏览器进行过滤或者部分请求
- 3.服务器正常响应。
- 4.执行源码与恶意代码
- 我们来看一个网站,当我们点击侧边栏的时候,我们的URL也随之发生变化,这个好像没什么神奇的。
- 问题在于URL里的#号,一般开发者使用这个#号是为了方便用户跳转(减少对服务器的请求),进行客户端渲染。
- 但是#后面这一片段默认是不发送给服务器的,也就是说,浏览器向服务器请求前面的一部分url,并且正常进行渲染。
- 如果URL里需要跳转到#号的部分再进行操作。正因为这样,浏览器的渲染分了两步走,给黑客开了个门,但并不是这样,就证明网页有漏洞了。
- Dom是因为XSS得满足最重要的两点,简单来说,就是在一个墙壁上找脆弱的位置,并且往脆弱的地方打洞。
- 这个位置就是一个属性,打洞就是一个方法,比如document.URL是一个属性,可以得到当前页面的URL。
- 而document.write就是一个方法,可以往页面里写内容,黑客就是找你源码里是否有可以操作的属性,如果有再看是否有与之对应的方法。
- 当然我们来一个实例会更清晰一些。
- 看看这个网站,除了URL以外,没有任何输入框,但是当我们点击图标按钮的时候,URL是会以#号的方式进行刷新的,如果此时我们在井号后面加上任意字符,你们看这个字符反应在页面上了,而且图片裂了,非常像反射型XSS。
- 但是#后的请求并未发送给服务器,那我们来留意一下反射到页面上的内容,大家可以看到用的是div标签,并且把tabContent设置为元素的id,为的就是更好的可以用javascript来操作这,个元素,我们记住这个tabContent,然后来看一看网页的js部分,熟悉jQuery的,看到这个多了符号就知道怎么回事了。
- 这里的意思就是把id为tabContent元素的html部分设置为变量名为html的值。
- jQuery的html()方法就类似于innerHTML,是可以被黑客利用来注入脚本的方法。
- 接下来就要看有没有可以被注入的属性或者值呢?
- 变量HTML的值就在上面进行设置,变量html里需要引用到参数num的值,这个num正是我们在URL的#号后输入的内容。
- 如果我们能控制这个num的值,就可以进行注入,那这个num参数所属的chooseTab函数,其实是在下面执行的。
- 我们可以看到chooseTab函数传入了一个要命的值, location.hash,也就是URL上#片段的值,
- 这就是黑客要找的属性了。
- 那么黑客就可以修改URL上#的值,从而触发jQuery的html()方法。
- 那黑客就有可能会这么搞你,这里不是要设置一个img标签吗?那就直接加一个单引号迫使src属性设置结束,但src属性明显是引用不了正确的地址,会发生错误。就可以顺势使用触发onerror,并且执行脚本。
IDOR漏洞
- 简单来说,当用户可以越权访问不属于他自己的资源,那就很可能出现IDOR漏洞了。
- 先来看后面三个字母,也就是直接对象引用。
- 比方说我们在某个应用里传了一份文件,应用服务器那边保存了这份文件。这份文件就是一个对象,文件也必须有名字才行。因此应用就会给这个文件命名,并且以某种方式对外暴露这份文件对象。
- 当我们下次访问文件的时候,可能就是在URL上显示这个文件对象的名字。我们访问这个URL就是在直接引用这个文件对象,这就是直接对象,引用对象不一定是文件,也可以是数据库里的某些数据,还可以是整个文件夹。
- 其实直接对象引用没问题,比如我们在b站搜索关键词出来的对应视频资源也是在直接引用对象。
- 问题就出在这个I上,insecure不安全的也就对应着前面说的越权不属于我们的对象资源,居然能被我们引用。
- 其实服务器对外暴露资源出去是很正常的,但是我们要对资源进行加工后再暴露才是正常的操作,防止IDRL最简单的方法就是增加权限。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 kukualのblog!