CTF网络攻防总结

文章目录

  • 前言
  • SQL注入
    • 万能密码表
    • union注入攻击
    • boolean注入攻击
    • 报错注入攻击
    • 时间注入攻击
    • 堆叠查询注入攻击
    • 二次注入攻击
    • 宽字节注入攻击
    • cookie注入攻击
    • base64注入攻击
    • xff注入攻击
    • 参考
  • 密码学
  • 工具
    • OWASP ZAP
    • Burp Suite

前言

本篇博客主要记录CTF的网络攻防的知识点,其中上机练习可以到BUUCTF上进行练习。特别说明一下可练习的平台有很多种,可以根据自己的喜好在自己喜欢的平台上进行练习。注意:本博客不再更新了,在我的github上可以查看更多更新的信息,地址:CTF,喜欢的可以给我个Star,谢谢!

SQL注入

万能密码表

摘自:sql注入指万能密码总结

  1. 万能密码原理
    用户进行用户名和密码验证时,网站需要查询数据库。查询数据库执行的是sql语句:select user_id, user_type, email from users where user_id = '用户名' and password = '密码' 。此时当输入adminpassword' or '1=1 时,sql语句会变为:select user_id, user_type, email from users where user_id = 'admin' and password = 'password' or '1=1' ,从而登录成功。
  2. 一些万能密码
语言 万能密码
php ’ or 1=‘1;‘or’=‘or’;admin’–;admin’ or 4=4–;admin’ or ‘1’=‘1’–;"or “a”="a;admin’ or 2=2#;a’ having 1=1#;a’ having 1=1–;’ OR ‘1’=‘1;1’or’1’=‘1;admin’ OR 4=4/*;1’or’1’='1
asp aspx 1:”or “a”=”a;2: ‘)or(‘a’=’a;3:or 1=1–;4:’or 1=1–;5:a’or’ 1=1–;6:”or 1=1–;7:’or’a’=’a;8:”or”=”a’=’a;9:’or”=’;10:’or’=’or’;11: 1;or ‘1’=’1’=1;12: 1 or ‘1’=’1’ or 1=1;13: ‘OR 1=1%00;14: “or 1=1%00;15: ‘xor
js 1’or’1’=’1;admin’ OR 1=1/*

union注入攻击

UNION操作符用于合并两个或多个SELECT语句的结果集,而且UNION内部的SELECT语句必须拥有相同数量的列,列也必须拥有相似的数据类型。同时每条SELECT语句中的列顺序必须相同。

UNION注入特点:

  1. 只有最后一个SELECT子句允许有Order by 或Limit。
  2. 注入点页面有回显

方法:

  • and 1=1
  • and 1=2

相关例子:https://www.cnblogs.com/lzlzzzzzz/p/11681309.html

boolean注入攻击

参考:SQL注入之布尔注入原理
所谓盲注就是在服务器没有错误回显的时候完成注入攻击。盲注分为布尔盲注和时间盲注。布尔盲注:boolean 根据注入信息返回true or fales 没有任何报错信息。时间盲注:界面返回值ture 无论输入任何值,返回的情况都是正常的来处。加入特定的时间函数,通过查看web页面返回的时间差来判断注入的语句是否正确。

常用函数:

length(str):返回str字符串的长度。
substr(str, pos, len):将str从pos位置开始截取len长度的字符进 行返回。注意这里的pos位置是从1开始的,不是数组的0开始
mid(str,pos,len):跟上面的一样,截取字符串
ascii(str):返回字符串str的最左面字符的ASCII代码值。
ord(str):同上,返回ascii码
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0

报错注入攻击

报错注入是一种SQL注入类型,用于使SQL语句报错的语法,用于注入结果无回显但错误信息有输出的情况。返回的错误信息即是攻击者需要的信息。

MySQL的报错注入主要利用MySQL的一些逻辑漏洞,如BigInt大数溢出等,由此可以将MySQL报错注入主要分为以下几类:

  1. BigInt等数据类型溢出;
  2. Xpath语法错误;
  3. count()+rand()+group_by()导致重复;
  4. 空间数据类型函数错误。

时间注入攻击

访问该网站时,页面返回yes,在网址的后面加上一个单引号,再次访问,页面返回no。这个结果与Boolean注入非常相似,这里介绍另一种注入方法——时间盲注。它与Boolean注入的不同之处在于,时间注入是利用sleep()或benchmark()等函数让MySQL的执行时间变长。时间盲注多与IF(expr1,expr2,expr3)结合使用,次if语句含义是:如果expr1是TRUE,则IF()的返回值为expr2;否则返回值则为expr3.所以判断数据库库名长度的语句应为:

' and if(length(database())>1,sleep(5),1)--+

堆叠查询注入攻击

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

二次注入攻击

二次注入的原理,在第一次进行数据库插入数据的时候,仅仅只是使用了 addslashes 或者是借助 get_magic_quotes_gpc 对其中的特殊字符进行了转义,但是addslashes有一个特点就是虽然参数在过滤后会添加 “\” 进行转义,但是“\”并不会插入到数据库中,在写入数据库的时候还是保留了原来的数据。在将数据存入到了数据库中之后,开发者就认为数据是可信的。在下一次进行需要进行查询的时候,直接从数据库中取出了脏数据,没有进行进一步的检验和处理,这样就会造成SQL的二次注入。比如在第一次插入数据的时候,数据中带有单引号,直接插入到了数据库中;然后在下一次使用中在拼凑的过程中,就形成了二次注入。

CTF网络攻防总结_第1张图片

宽字节注入攻击

宽字节注入,在 SQL 进行防注入的时候,一般会开启 gpc,过滤特殊字符。一般情况下开启 gpc 是可以防御很多字符串型的注入,但是如果数据库编码不对,也可以导致 SQL 防注入绕过,达到注入的目的。如果数据库设置宽字节字符集 gbk 会导致宽字节注入,从而逃逸 gpc前提条件

简单理解:数据库编码与 PHP 编码设置为不同的两个编码那么就有可能产生宽字节注入

深入讲解:要有宽字节注入漏洞,首先要满足数据库后端使用双/多字节解析 SQL语句,其次还要保证在该种字符集范围中包含低字节位是 0x5C(01011100) 的字符,初步的测试结果 Big5 和 GBK 字符集都是有的, UTF-8 和 GB2312 没有这种字符(也就不存在宽字节注入)。

cookie注入攻击

cookie注入其原理也和平时的注入一样,只不过说我们是将提交的参数已cookie方式提交了,而一般的注入我们是使用get或者post方式提交,get方式提交就是直接在网址后面加上需要注入的语句,post则是通过表单方式,get和post的不同之处就在于一个我们可以通过IE地址栏处看到我们提交的参数,而另外一个却不能。

相对post和get方式注入来说,cookie注入就要稍微繁琐一些了,要进行cookie注入,我们首先就要修改cookie,这里就需要使用到Javascript语言,或者burp拦截。

另外cookie注入的形成有两个必须条件,

条件1是:程序对get和post方式提交的数据进行了过滤,但未对cookie提交的数据库进行过滤。

条件2是:在条件1的基础上还需要程序对提交数据获取方式是直接request(“xxx”)的方式,未指明使用request对象的具体方法进行获取,也就是说用request这个方法的时候获取的参数可以是是在URL后面的参数也可以是cookie里面的参数这里没有做筛选,之后的原理就像我们的sql注入一样了。

COOKIE 注入与 GET、POST 注入区别不大,只是传递的方式不一样。GET 再url 传递参数、POST 在 POST 正文传递参数和值,COOKIE 在 cookie 头传值。

base64注入攻击

可参考:https://blog.csdn.net/Drifter_Galaxy/article/details/108678793

xff注入攻击

可参考:https://blog.csdn.net/Drifter_Galaxy/article/details/108679969

附sqlmode值的介绍:

  • ONLY_FULL_GROUP_BY:出现在select语句、HAVING条件和ORDER BY语句中的列,必须是GROUP BY的列或者依赖于GROUP BY列的函数列。
  • NO_AUTO_VALUE_ON_ZERO:该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
  • STRICT_TRANS_TABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制
  • NO_ZERO_IN_DATE:这个模式影响了是否允许日期中的月份和日包含0。如果开启此模式,2016-01-00是不允许的,但是0000-02-01是允许的。它实际的行为受到 strict mode是否开启的影响1。
  • NO_ZERO_DATE:设置该值,mysql数据库不允许插入零日期。它实际的行为受到 strictmode是否开启的影响2。
  • ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时MySQL返回NULL
  • NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户
  • NO_ENGINE_SUBSTITUTION:如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常
  • PIPES_AS_CONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
  • ANSI_QUOTES:启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解释为识别符

参考

  1. SUCTF 2019 EasySQL

密码学

工具

OWASP ZAP

Burp Suite

实战指南:Burp Suite 实战指南

未完,持续更新中。。。。

你可能感兴趣的:(基础知识,网络,安全,web安全)