sql注入基础总结

现在来总结一下基本sql注入,有个思路,以后再谈高级注入技巧和怎么绕过waf.

SQL注入分类

  1. 基于联合查询
  2. 基于错误回显
  3. 盲注

基本注入思路:

 

1. 先判断是否存在注入,字符型还是数字型

?id=1' and 1=2#?id=1' and 1=1#
判断是否存在注入,是字符型还是数字型。

 

2.猜查询语句的字段数

1' order by 3#
通过后面的数字是否报错展现出字段数,方便后面构造注入语句

 

3. 获取数据库

1' union select 1,database()#
同样的,也可以获取以下信息

  • user():当前数据库用户
  • database():当前数据库名
  • version():当前使用的数据库版本
  • @@datadir:数据库存储数据路径

 

4. 获取表名

mysql中,数据库表,列的信息都储存在information_schema 中

 

5. 获取列名

后面就可以随意查询数据库数据啦。

 

盲注

  1. 基于布尔SQL盲注
  2. 基于报错SQL盲注
  3. 基于时间SQL盲注

1. 基于布尔SQL盲注

    函数讲解:mid(),mid(str,a,b)意味取str从a位置起b个字符
                    substr() = substring()=mid()
                    left(), left(string,n)意为取string左边n个字符, left(database(),2)=’ab’
                    ascii()=ord(),获得字符的ascii值
                    regexp, 匹配正则表达式
                    like
playload:
  • left(database(),1)>'s'
  • ascii(substr(select table_name from information_schema.tables where tables_schema=database() limit 0,1),1,1)) = 97 --+
  • ascii(substr(database(),1,1))=98
  • select user() regexp '^root'
  • select * from users where id=1 and 1=(if((user() regexp '^r'),1,0))
  • select user() like '^root'

 

2. 基于报错的SQL盲注

基于报错的sql注入利用了MySQL的第8652号bug ,Bug 8652的主要内容就是在使用group by 对一些rand()函数进行操作时会返回duplicate key 错误,而这个错误将会披露关键信息,如”Duplicate entry ‘####’ for key 1″

函数讲解:
  • count(*)计数,包括全部字段
  • rand()产生随机数
  • concat()字符串连接
  • floor()向下取整

playload:

例如:

 

3. 基于时间的SQL盲注

BENCHMARK(count,expr)用于测试函数的性能,参数一为次数,二为要执行的表达式。可以让函数执行若干次,返回结果比平时要长,通过时间长短的变化,判断语句是否执行成功。这是一种边信道攻击,在运行过程中占用大量的cpu资源。推荐使用sleep()
简单基础就总结到这里了,sql注入还有很多内容,待我慢慢来研究。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注