一.浏览器打开sqli.com/sqli-1.php

SQL注入原理与实践_单引号

 

 源码

SQL注入原理与实践_mysql_02

 

如果加and 1=1 页面显示正常,加and 1=2页面不正常或者错误,同样说明存在SQL注入;如果不加单引号页面显示正常,而加了单引号以后,页面显示不正常或者错误,则说明网页存在SQL注入

SQL注入原理与实践_mysql_03

 

 SQL注入原理与实践_php_04

 

 修改源码,添加第14行

SQL注入原理与实践_sql注入_05

 

 访问http://localhost/phpmyadmin/,如果需要输入密码,账号输入root,密码为空,然后点击执行登录, 然后点击左边的sqli,在右侧的new这一行选择浏览,再选择SQL。

SQL注入原理与实践_sql注入_06

 

 执行

SQL注入原理与实践_mysql_07

 

 通过and 1=1和and 1=2来判断网页是否存在SQL注入的原理SQL注入原理与实践_sql注入_08

SQL注入原理与实践_sql注入_08

 

 

 

 SQL注入原理与实践_sql_10

 

 

去phpmyadmin里验证,分别执行这2条语句

SQL注入原理与实践_sql注入_11

 

 SQL注入原理与实践_sql_12

 

 访问http://sqli.com/sqli-1.php?id=1 or 1=1

SQL注入原理与实践_php_13

 

 二.我们希望的是能够通过注入,获取一些网站管理员不希望我们知道的数据,比如管理员的账号密码。

通过union操作符就可以达到我们的目的,union可以合并两条或者多条select语句的查询结果,它的语法如下:

    Select column-1,column-2,…,column-N from table-1 union select column-1,column-2,…,column-N from table-2

SQL注入原理与实践_php_14

 

 SQL注入原理与实践_php_15

 

 

使用union有一些限制: 1.两个查询返回的列数必须型相同。2.两个select语句对应列所返回的数据类型必须是相同或者是兼容的

 执行show create table new来查看建表语句

SQL注入原理与实践_php_16

 

 可以点击选项,选中完整内容。

SQL注入原理与实践_sql_17

 

 

  可以看到这个表有3列,然后来测试用order by子句来测试列数量,从1开始,每次查询加1,加到报错为止

SQL注入原理与实践_sql注入_18

 

 SQL注入原理与实践_sql注入_19

 

 SQL注入原理与实践_sql_20

 

 

 SQL注入原理与实践_sql_21

因为这里一共只有3列,但是你要根据第4列来进行排序,当然就会报错了。

注入页面进行测试。

SQL注入原理与实践_php_22

 

 SQL注入原理与实践_单引号_23

 

 SQL注入原理与实践_mysql_24

 

 执行

SQL注入原理与实践_sql注入_25

 

 SQL注入原理与实践_php_26

 

 我们可以执行一些数据库函数

SQL注入原理与实践_php_27

 

 SQL注入原理与实践_sql注入_28

 

 SQL注入原理与实践_sql注入_29

 

 三.

 修改sqli-1.php源文件,16、17、18行

SQL注入原理与实践_mysql_30

 

 再次访问上述链接

SQL注入原理与实践_php_31

 

 构造如下语句  1 union select 1, table_name,3 from information_schema.tables where table_schema='mysql'

SQL注入原理与实践_php_32

 

 访问后返回该表中所有的列名。

SQL注入原理与实践_sql_33

 

  1 union select 1, User, Password from mysql.user

SQL注入原理与实践_单引号_34

 

 进入phpmyadmin确认一下

SQL注入原理与实践_单引号_35

 

  进入mysql终端看一下,到底有多少条记录。

SQL注入原理与实践_sql_36