sqli labs(Less5~10)SQL布尔盲注、报错注入,延时注入,对几个函数的理解

SQL注入

对第五关采用SQL布尔盲注,对第六关采用报错注入和延时注入。查看标题发现这两关的区别在于:less5是单引号报错注入,less6是双引号

SQL-Labs Less5

加上\ 发现错误:’‘1’ LIMIT 0,1’ 去两边单引号:‘1’ LIMIT 0,1
sqli labs(Less5~10)SQL布尔盲注、报错注入,延时注入,对几个函数的理解_第1张图片
推测原SQL语句: select *from table where id= i d l i m i t 0 , 1 ; id limit 0,1; idlimit0,1;id=‘输入的id’
可是输入正确的id后却不可输出对应的账户和密码,通过查看原码发现页面上无法输出SQL语句的执行结果。即页面无法回显出想要的内容。
因此推测该关卡是:SQL盲注。说下对几个函数的理解同时实现盲注

1.left(str, b)

含义:返回字符串str的前b个字符。因此可利用database()返回的数据库名对其盲猜,先对数据库名的字符位数用length(database())盲猜,之后可用left()函数通过version()函数猜出数据库的版本。。。。
这个过程是比较麻烦的,可用脚本执行也可用bp进行破解。得到数据库名’security‘

2.substr(str,b,c)

函数含义:返回字符串str自第b个后的前c个字符。
因此可组合SQL语句substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)可返回当前数据库的第一个数据表名的第一个字符。
注意:若出现Subquery returns more than 1 row这样的错误证明返回结果不知一个数据,应注意select后加上limit 。
如果你有这样的疑问:如何获取这个security数据库中的其他数据表呢?很好,证明你已经细想了这个SQL语句。你不妨多想一下,我在文末说下方法。

3.mid(str,b,c)

函数含义:返回字符串str自第b个后的前c个字符。用法同上

4.ascii(str,b,c)

另外还可以对substr(str,b,c)函数返回的字符进行ascii码转换,使用ascii(a,b,c)含义:返回字符串str自第b个后的前c个字符的ascii码。

5.ord(str)

函数用法:可返回str字符串的第一个ascii码值。

6.regexp正则表达式:

通过使用SQL的正则表达式来判断数据表名。select ‘str’ regexp ‘^b’。若字符串str与字符串b不相同则返回值为0。同样的也可以在这个select语句后边加上limit来限制所获取到的数据表名。

在此仅仅是使用多个函数进行检测,无非查数据库就必须用第一个,不然所有的查法都可用left函数只是注意变换。

答案:注意substr函数中的select语句下的limit这个就是限制搜索到的第几个数据表的,若没有这一句就会报出:Subquery returns more than 1 row

我们应该有举一反三的思维:我们是不是可以利用length函数通过高亮的SQL语句得出数据表的字符数?当然也不是特别有必要知道,因为一个一个试的话,毕竟有点不现实。大部分还是要爆破的或者直接使用SQLmap。

Less6

根据报错信息推测原SQL语句: select *from table where id= id limit 0,1;$id=“输入的id”

报错注入

1.concat(str1,str2,…)

函数含义:连接字符串str1,str2…(为使显示的结果明显可在之中加上16进制的:0x3a或者~0x7e)

2.extractvalue(目标xml文档,xml路径)

函数含义:对XML文档进行查询的函数。
用法:以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。extractvalue(1,concat(0x7e,(select username,password from users limit 0,1),0x7e)) --+ 不过这个语句只可查到一个数据,若是一直改变limit也是件很麻烦的事。因此可以在select语句中将查询的结果用group_concat()进行包裹,得到语句:extractvalue(1,concat(0x7e,(select group_concat(username,0x7e,password ) from users limit 0,1),0x7e))
有一点需要注意,extractvalue()能查询字符串的最大长度为32,就是说如果我们想要的结果超过32,就需要用substring()函数截取,一次查看32位。

3.updatexml(目标xml文档,xml路径,更新的内容)

函数含义:updatexml()函数与extractvalue()类似,是更新xml文档的函数。
用法与updatexml()基本相同。
可将一些SQL语句代替xml路径,利用报出xml路径错误的信息可较简单的获取到想要的数据库信息
在此非常感谢这位博主的文章, 原文.讲的非常详细https://blog.csdn.net/zpy1998zpy/article/details/80631036
sqli labs(Less5~10)SQL布尔盲注、报错注入,延时注入,对几个函数的理解_第2张图片

4.name_const(name,value)

函数含义:返回一个name值为value,
使用:mysql列名重复会导致报错,通过name_const制造一个列。利用数据的重复性
注入语法:select 1,2,3 from (select NAME_CONST(‘SQL语句’,value), NAME_CONST(‘SQL语句’,value)x --+

5.也可以利用数学公式计算结果值的溢出报错。例如exp()函数

延时注入(基于时间的注入)

1.sleep(value)

函数含义:停留value秒
使用方法:If(判断语句,1,sleep(5))如果判断语句成立,执行1!=0成立,否则执行sleep(5)停留5秒钟,根据时间来判断判断语句是否成立。
效果图:?id=12’ and if(left((select database()),1)=“s”,sleep(2) ,1 )–+
sqli labs(Less5~10)SQL布尔盲注、报错注入,延时注入,对几个函数的理解_第3张图片

Less7

第一步是获取数据库文件写入权限(我是个小白)
在数据库中通过select variables like “%secure%” 可查询到结果是NULL。因为这是默认的。所以我们需要对其进行修改具体方法简单可以自行百度。这里我提示一下:更改mysql配置后需要在phpstudy中重启mysql。
老样子还是检查看字段数order by value --+,之后使用联合查询
union select 1,2,’’ into outfile “D:\phpstudy_pro\WWW\sqli-labs-master\Less-7\1.php”–+直接将一句话木马写到less7目录下的1.php文件中。注意:在这个文件中也会有id=1那一行的数据,可以通过这个方法来依次输出数据库中的用户名和密码。更厉害的是利用这个一句话木马配合使用中国菜刀可直接获取数据库最高权限。

数据库文件操作函数

1.into outfile与into dumpfile
outfile函数可以导出多行,而dumpfile只能导出一行数据
2.load_file
读取文件并返回文件内容为字符串。使用此函数,该文件必须位于服务器主机上,必须指定完整路径的文件,必须有FILE权限。该文件必须被所有和它的尺寸小于max_allowed_packet个字节可读。
拓展:可使用select load_file(‘D:\phpstudy_pro\Extensions\MySQL5.7.26\my.ini’)into outfile ‘D:\phpstudy_pro\WWW\1.php’语句可将服务器的文件导入到web服务器目录下

Less8~10

这两关方法基本同5,6两关。在此不说啦。

写在后边

不知为何原因报错注入中的溢出报错和name_const()函数无法成功报出想要的错误结果。希望能够得到大佬的指点。
sqli labs(Less5~10)SQL布尔盲注、报错注入,延时注入,对几个函数的理解_第4张图片

你可能感兴趣的:(SQL注入,mysql)