index.php 分析
(结合表单的知识,html具有name属性,name='id'),当然在这里跟这个关系不是很大,$id=$_GET['id']可以认为是从地址栏取id的值,比如地址栏id=3,则$id=3;
代码逻辑分析:
需要id的值,当id没有值时,isset() — 检测变量是否已设置并且非 NULL,当我们没有输入时可以认为没有设置,则执行上图中if对应的else(红线连接)
当id符合服务器数据库的解析规则时,先执行mysql_query() 函数返回资源标识符(可以认为是指针),传给 mysql_fetch_array()返回从结果集取得的行生成的数组(正常非零),打印出要求的数据行
知识点:闭合方式
单引号''、双引号""、括号()、括号+单引号('')、多层括号+单引号,例((((((((''))))))))。mysql还可以使用括号+双引号("")和多层括号+双引号((((((((""))))))))
可以认为闭合方式是为了解析用的,比如id=1,最终变为id='1',有点类似是为了将接收到的信息标记,这是我对闭合的一点看法
下图的1是我们传入的参数,顺便打印出了sql语句,应为是初学,所以更容易理解注入一些
Less-1
再了解闭合方式之后就可以开始了
根据提示要求输入数字型参数
回显id=1那一行用户名和数据(当然这只是我们看到的)
1"与1的效果一致,这跟解析的机制相关,可以认为数据库会识别数,不管",也就是代码的解析规则与"无关,所以不会是""闭合
由报错提示,可以知道是单引号''=即'id'因为 ' 1' ' 造成不对称所以才会报错提示''1''
我们检测的结果与$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";相吻合
关于'id'的理解,有''可以解析执行 ,比如1' and '1'='2 这样为假,无回显(因为条件为假,其实就是什么都不选择,查询不会返回数据),1' and 1=2或1 and 1=2可以认为字符串只取1,遇到and就不再解析了,这里的解释也不是很好,还请各位大佬赐教,斧正。
字段数检测:三个字段及三列(最新版的火狐与Hackbar中'无法直接输,可以用%27代替,#用%23代替)
利用联合查询查看可以回显的字段,并泄露一些信息version(),user(),group_concat()
index.php?id=-1%27 union select 1,database(),user()--+
index.php?id=-1%27 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x696e666f726d6174696f6e5f736368656d61),3--+
index.php?id=-1%27 union select 1,(select group_concat(table_name) from information_schema.tables where table_schema=0x7365637572697479),3--+
index.php?id=-1%27 union select 1,(select group_concat(0x28,username,0x2d,password,0x29) from users),3--+
加分隔号,其实就是对应的ASCLL